@group47

Как задать скрипту условие работы только от определенного пользователя?

Извините, если это флуд. Сам я не разбираюсь в программировании

Имеется вот такой скрипт ниже. Он собирает информацию об изменениях в Гугл таблице (дату изменения, пользователь, лист, ячейку, старое и новое значения) и записывает эти сведения на отдельном листе поочередно. (Грубо говоря это реестр изменений в документе)

function onEdit001(event) {
var as = event.source.getActiveSheet();//Текущий лист
var address = event.range.getA1Notation().toUpperCase();//Адрес ячейки
var row = event.range.getRow(); //Номер строки
var col = event.range.getColumn(); //Номер столбца
var newValue = event.value; //Новое значение
var oldValue = event.oldValue; //Старое значение
var userEmail = event.user.getEmail();//Пользователь(работает только при вручную назначенном триггере)

let archiveSheetName = "reg";
let ss = SpreadsheetApp.getActiveSpreadsheet();
let archiveSheet = ss.getSheetByName(archiveSheetName) || ss.insertSheet(archiveSheetName);
archiveSheet.appendRow([new Date(), userEmail, as.getName(), address, oldValue, newValue]);
};

Скрипт привзан к Гугл таблице.
Доступ к гугл таблице имеется у 3-х пользователей. Больше никто не может просматривать/копировать/скачивать и тд эту таблицу.
xxx1@gmail.com - владелец
xxx2@gmail.com - редактор
xxx3@gmail.com - редактор

Как мне задать условие вышеуказанному скрипту, при котором он будет срабатывать ТОЛЬКО в случае, если с таблицей работает один определенный пользователь (например xxxx3@gmail.com) ? Т.е. скрипт будет работать при условии, что ТЕКУЩИЙ пользователь именно xxxx3@gmail.com.

Сейчас скрипт работает, если ЛЮБОЙ из доступных пользователей будет редактировать Гугл таблицу.

Через Триггер пробовал - работает коряво. Вроде как от отдельных пользователей создаю Триггер на основе этого скрипта, но скрипт начинает дублировать выдаваемую информацию (по 2-3 раза в зависимости от количества пользователей)
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
@group47 Автор вопроса
Решил вопрос самостоятельно.
Примечание: Работает, только если Владелец таблицы (xxxx1@gmail.com) выдал права на редактирование таблицы Пользователю (xxxx2@gmail.com). Если не выдавать разрешение на редактирование Таблицы - скрипт не будет работать. А если и заработает, то точно не укажет имя пользователя, который внес изменения в таблице.
Решение:
Создаем скрипт, называем его как угодно (в моем случае "newOnEdit001"), задаем ему код, который ниже:
function newOnEdit001(event) {
    // Получаем текущего пользователя
    var currentUser = Session.getActiveUser();
    // Проверяем, является ли текущий пользователь "xxxx2@gmail.com"
    if (!currentUser || currentUser.getEmail() !== 'xxxx2@gmail.com') {
        // Если текущий пользователь не совпадает, выходим из функции
        return;
    }
    
    // Получаем объект события и данные о редактировании
    var sheet = event.source.getActiveSheet(); // Лист, на котором произошло редактирование
    var range = event.range; // Диапазон ячейки, в которой произошло редактирование
    var userEmail = currentUser.getEmail(); // Почта пользователя, который внес изменения
    var date = new Date(); // Текущая дата и время редактирования
    var sheetName = sheet.getName(); // Имя листа, на котором произошло редактирование
    var cellAddress = range.getA1Notation(); // Адрес ячейки, где произошло редактирование
    var oldValue = event.oldValue; // Старое значение в ячейке
    var newValue = event.value; // Новое значение в ячейке

    // Получаем активную таблицу
    var spreadsheet = event.source;

    // Проверяем, существует ли лист "registry"
    var registrySheet = spreadsheet.getSheetByName('registry');
    if (!registrySheet) {
        // Если листа "registry" нет, создаем его
        registrySheet = spreadsheet.insertSheet('registry');
    }

    // Создаем кликабельную ссылку на измененную ячейку
    var cellUrl = spreadsheet.getUrl() + "#gid=" + sheet.getSheetId() + "&range=" + cellAddress;

    // Записываем данные о редактировании на лист "registry"
    registrySheet.appendRow([
        userEmail, // Имя пользователя, который внес изменения
        date, // Дата редактирования
        sheetName, // Имя листа, где произошло редактирование
        '=HYPERLINK("' + cellUrl + '";"' + cellAddress + '")', // Кликабельная ссылка на ячейку
        oldValue, // Старое значение в ячейке
        newValue // Новое значение в ячейке
    ]);
}


Для вас важны только вот эти строчки:
var currentUser = Session.getActiveUser();
    
    // Проверяем, является ли текущий пользователь "xxxx2@gmail.com"
    if (!currentUser || currentUser.getEmail() !== 'xxxx2@gmail.com') {
        // Если текущий пользователь не совпадает, выходим из функции
        return;
    }
    
    // Получаем объект события и данные о редактировании
    var sheet = event.source.getActiveSheet(); // Лист, на котором произошло редактирование
    var range = event.range; // Диапазон ячейки, в которой произошло редактирование
    var userEmail = currentUser.getEmail(); // Почта пользователя, который внес изменения
    var date = new Date(); // Текущая дата и время редактирования
    var sheetName = sheet.getName(); // Имя листа, на котором произошло редактирование
    var cellAddress = range.getA1Notation(); // Адрес ячейки, где произошло редактирование
    var oldValue = event.oldValue; // Старое значение в ячейке
    var newValue = event.value; // Новое значение в ячейке


Остальное - это уже чисто под мои личные нужды. Хотите пользуйтесь, хотите нет.

Суть в чем. Скрипт будет работать ТОЛЬКО если редактор будет иметь почту (имя) "xxxx2@gmail.com". Если кто либо другой будет редактировать таблицу - скрипт не заработает.

Если у нас 10 Пользователей, то надо создать 10 скриптов, в каждом из которых поменять вот эти строчки на нужного пользователя (заменить xxxx2@gmail.com на почту нужного вам Редактора):

// Получаем текущего пользователя
    var currentUser = Session.getActiveUser();
    
    // Проверяем, является ли текущий пользователь "xxxx2@gmail.com"
    if (!currentUser || currentUser.getEmail() !== 'xxxx2@gmail.com') {


Затем, заходим в раздел Триггеры (в редакторе скриптов) предварительно авторизовавшись за Пользователя xxxx2@gmail.com (он же Редактор). Или просто попросите нужного вам пользователя совершить эти действия самостоятельно.
Жмем "Добавить Триггер" - выбираем функцию newOnEdit001, Основное развертывание, Из таблицы, При редактировании - Сохранить.

Теперь, когда Пользователь "xxxx2@gmail.com" будет редактировать Таблицу, сработает Триггер на функцию newOnEdit001, который сначала проверит кто вносит изменения и только затем будет записывать его действия в соответствующем порядке. Скрипт newOnEdit001 можно скопировать N раз и задать за каждого Пользователя N количество триггеров.

Тем самым, в таблице вы всегда будете знать кто, когда, где, как вносил изменения в вашу таблицу.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Пользователь должен установить триггер от своего имени. И уже в функции вы можете проверять Session.getActiveUser(), чтобы гарантировать запуск только для заданого пользователя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы