Active VS Эффективный пользователь для Google Sheets
Я пишу простое приложение-скрипт приложения Google, которое выполняет некоторые манипуляции с данными в зависимости от пользователя, который запрашивает страницу.
Согласно документации Google объект Session имеет getActiveUser() и getEffectiveUser(), которые я в настоящее время использую для определения пользователя. Посмотрите на код:
var email = Session.getActiveUser().getEmail();
switch (email){
case 'test@gmail.com':
/*Some code here*/
return true;
case 'test2@gmail.com':
/*Some code here*/
return true;
default:
return false;
}
Похоже, что он должен работать, к сожалению, он не работает, как ожидалось (по крайней мере, для меня).
Приведенный выше код запускается при срабатывании триггера onOpen, и все разрешения устанавливаются, когда пользователь пытается запустить этот код в первый раз.
Итак, я решил выполнить трассировку и выяснил, что Session.getActiveUser().getEmail();
а также Session.getEffectiveUser().getEmail();
вернуть неправильные электронные письма для пользователей.
Для 1-го пользователя (меня), который создал скрипт Session.getActiveUser().getEmail();
возвращает правильный адрес электронной почты, но для всех остальных он также возвращает мой адрес электронной почты. Хорошо, я решил заменить Session.getActiveUser().getEmail();
с Session.getEffectiveUser().getEmail();
и БУМ - это работает для других, но не работает для меня...
Как это могло произойти? Какие-нибудь мысли?
- Я заметил, что когда я запускаю код из ScriptEditor, код работает как обаяние для всех пользователей, но когда он запускается при запуске onOpen, он работает непредсказуемо.
Эта таблица предназначена для нескольких человек.
Любая помощь приветствуется.
1 ответ
Короткий ответ
Код передает неправильные операторы, потому что нет операторов break, чтобы избежать их выполнения, с другой стороны, для учетных записей потребителей (gmail.com) getActiveUser будет возвращать значение только тогда, когда скрипт выполняется активным пользователем1.
1: https://developers.google.com/apps-script/reference/base/session
объяснение
Вы должны добавить break;
в конце каждого случая набор операторов, в противном случае операторы также будут выполнены. Вместо этого рассмотрите следующие для вас тесты.
Альтернативный тестовый код
function onOpen(){
myFunction('On open - simple trigger');
}
function onOpenInstallable(){
myFunction('On open - installable trigger');
}
function runFromScriptEditor(){
myFunction('Run - script editor');
}
function myFunction(context) {
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();
var range = sheet.getRange(lastRow + 1,1,1,4);
var output = [[
new Date(),
context,
Session.getActiveUser().getEmail(),
Session.getEffectiveUser().getEmail()
]];
range.setValues(output);
}
Результат
Владелец: testA@gmail.com
Редактор: testB@gmail.com
- Строки 1 и 2 добавлены, когда электронная таблица была открыта testA@gmail.com
- Строки 3 и 4 добавлены, когда электронная таблица была открыта testB@gmail.com
- Строка 6 добавляется, когда полоса запускается нажатием кнопки "Выполнить" в редакторе сценариев testB@gmail.com
+---+------------+-------------------------------+-----------------+-----------------+
| | A | B | C | D |
+---+------------+-------------------------------+-----------------+-----------------+
| 1 | Timestamp | Context | Active User | Effective User |
| 2 | 10/29/2016 | On open - simple trigger | testA@gmail.com | testA@gmail.com |
| 3 | 10/29/2016 | On open - installable trigger | testA@gmail.com | testA@gmail.com |
| 4 | 10/29/2016 | On open - simple trigger | | |
| 5 | 10/29/2016 | On open - installable trigger | | testA@gmail.com |
| 6 | 10/29/2016 | Run - script editor | testB@gmail.com | testB@gmail.com |
+---+------------+-------------------------------+-----------------+-----------------+