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

    @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 количество триггеров.

    Тем самым, в таблице вы всегда будете знать кто, когда, где, как вносил изменения в вашу таблицу.
    Ответ написан
    Комментировать
  • Как получить имя пользователя, который внес изменения в таблице?

    @group47 Автор вопроса
    Alexander Ivanov я был бы вам очень признателен за раскрытие вопроса. Понимаю, что его может кто то в каких-то своих других корыстных целях может и применит и совесть его будет не чиста. Но в моем случае, доступ к таблице имеет только 3 человека. И все они редакторы. И в интересах нашей деятельности, необходимо отслеживать изменения.
    У гугл таблицы есть функция, которая отображает старые версии файла и там как раз выделяются определенным цветом ячейки, которые были в редактировании тем или иным пользователем (с отображением реальной почты того кто работал с этой ячейкой). Так вот. Почему подобная вшитая функция Гугла считается безопасным, а мой вариант уже нет?))))
    Ответ написан
    Комментировать