在onOpen简单触发器中使用时权限API调用失败



我创建了一个带有应用程序脚本的Google工作表,用于跟踪问题和任务。我尝试实现的功能之一是基于权限的任务分配。作为这方面的先驱,我有一个隐藏的工作表,其中填充了用户及其文件权限的列表,使用的代码与StackOverflow问题中的代码类似

当我手动运行代码时,它运行良好。但是,我希望每次打开工作表时都加载它,以防有新人进入组或有人离开组。所以我在onOpen简单触发器中调用了我的函数。然而,当它通过onOpen调用时,我会得到以下信息:

GoogleJsonResponseException:对drive.permissions.list的API调用失败,返回错误:需要登录在getPermissionsList(MetaProject:38:33(在onOpen(MetaProject:44:3(

以下是我的函数:

我的onOpen简单触发器:

function onOpen() {
//Constant Definitions for this function
const name_Access = 'ACCESS';
const row_header = 1;
const col_user = 1;
const col_level = 2;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sht_Access = ss.getSheetByName(name_Access);
var ui = SpreadsheetApp.getUi();
ui.createMenu('MetaProject')
.addSubMenu(
ui.createMenu('View')
.addItem('Restore Default Sheet View', 'restoreDefaultView')
.addItem('Show All Sheets', 'showAllSheets')
)
.addSeparator()
.addToUi();
//Clear Contents, Leave Formatting
sht_Access.clearContents();
//Set Column Headers
var head_name = sht_Access.getRange(row_header,col_user);
var head_level = sht_Access.getRange(row_header,col_level);
head_name.setValue('User');
head_level.setValue('Level');
//Refresh User List for use in this instance
getPermissionsList();
}

以下是getPermissionsList:

function getPermissionsList() {
const fileId = "<REDACTED>"; // ID of your shared drive
const name_Sheet = 'ACCESS';
const row_start = 2;
const col_user = 1;
const col_access = 2;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var thissheet = ss.getSheetByName(name_Sheet);
// THIS IS IMPORTANT! The default value is false, so the call won't 
// work with shared drives unless you change this via optional arguments
const args = {
supportsAllDrives: true
};
// Use advanced service to get the permissions list for the shared drive
let pList = Drive.Permissions.list(fileId, args);
//Put email and role in an array
let editors = pList.items;
for (var i = 0; i < editors.length; i++) {
let email = editors[i].emailAddress;
let role = editors[i].role;
//Populate columns with users and access levels / role
thissheet.getRange(row_start + i,col_user).setValue(email);
thissheet.getRange(row_start + i,col_access).setValue(role);
}

我在发帖前进行了搜索,并通过评论中的一些相关问题找到了答案,但我没有看到真正的答案。答案是,你不能从简单触发器调用权限或任何需要授权的东西。你必须执行一个可安装的触发器。

要做到这一点,请执行以下操作:

  1. 创建您的函数或将其重命名为";打开";。

    注意:如果你把它命名为onOpen(正如我最初所做的并在这个答案中发布的那样(,它会起作用,但你实际上会运行两个触发器——可安装触发器和简单触发器。简单触发器将生成一个错误日志,因此建议使用不同的名称。

  2. 单击应用程序脚本左侧的时钟(触发器(图标。

  3. 单击"+"添加触发器";在右下角的中

  4. 为";哪个函数运行";

  5. 选择";打开";对于";选择事件类型";

  6. 单击";保存";。

我上面的代码现在运行得很好。

最新更新