Как получить активную электронную почту пользователя с установленным триггером onEdit? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть таблица Google с некоторыми данными. Я написал скрипт для отслеживания изменений некоторых c столбцов.

function onOpen() {
  var ss = SpreadsheetApp.getActive();
  var menuItems = [
    {name: 'Turn on', functionName: 'createSpreadsheetEditTrigger'}
    ];
  ss.addMenu('Tracker', menuItems);
}


function changeTrack(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ui = SpreadsheetApp.getUi();
  var ws = ss.getActiveSheet(); 
  const headerRow = 4;
  const editBodyCols = [2, 3, 4, 5];
  const fResultCol = 6;
  var range = ws.getActiveRange();
  var row = range.getRow();
  var col = range.getColumn();
  let target1 = ws.getRange(row, fResultCol);  
  let target2 = ws.getRange(row, fResultCol + 1)
  let activeUser = getCurrentUserEmail();
  if(row > headerRow && editBodyCols.some(x => x === col) === true){
    if(target1.getValue() !== ""){
    target2.setValue(result(ss, ws, row, activeUser)[1]);
    } else {
      target1.setValue(result(ss, ws, row, activeUser)[0])
      target2.setValue(result(ss, ws, row, activeUser)[1])
    }
  }  
}

function createSpreadsheetEditTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('changeTrack')
      .forSpreadsheet(ss).onEdit()     
      .create();
}

function date(){
  return  Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");  
}

function result(ss, ws, row, activeUser) {  
  const ssName = ss.getName();  
  let data = `Создал ${activeUser} ${date()}`;
  let exp = `Файл ${ssName}, Лист ${ws.getName()}, изменил ${activeUser}, строка № ${row}, ${date()}`;
  let adds = [];
  adds.push([data],[exp]);
  return adds;
}

function getCurrentUserEmail()
{
  var email=Session.getActiveUser().getEmail();
  return email;
}

Моя проблема - получить электронную почту активного пользователя. Этот сценарий может получить это, но не все время. Похоже на случайный успех. Это означает, что иногда я могу получить ожидаемую ценность, иногда нет. Не понимаю от чего это зависит. Где я не прав и как исправить?

1 Ответ

1 голос
/ 07 мая 2020

Из документации на Session.getActiveUser():

Получает информацию о текущем пользователе. Если политики безопасности не разрешают доступ к личности пользователя, User.getEmail () возвращает пустую строку. обстоятельства , при которых доступен адрес электронной почты варьируется : например, адрес электронной почты пользователя недоступен в любом контексте, который позволяет запускать сценарий без авторизации этого пользователя, например, простой триггер onOpen (e) или onEdit (e), настраиваемая функция в Google Таблицах или веб-приложение развернут для «выполнения как я» (то есть авторизован разработчиком, а не пользователем).

Так что это кажется вполне ожидаемым, и вы не можете найти обходного пути для получения почты пользователей. Возможно, вам стоит просто попросить его и посмотреть, захотят ли они его вам дать.

Хотя, если вы разработчик или пользователи внутри вашей организации, эти ограничения можно игнорировать:

Однако эти ограничения обычно не применяются, если разработчик запускает сценарий самостоятельно или принадлежит к тому же домену G Suite, что и пользователь.

...