以前工作 Google App 脚本现在产生权限错误
Previously working Google App Script now produces permission error
我找不到关于 Google 在 2022 年 4 月更新政策的任何信息。此脚本之前运行没有任何问题,然后在一天中间,需要重新添加权限。即使有上述权限 g运行ted,Google 仍然说访问被拒绝。后来发现宏自3月31日起就没有运行成功
var newJobFile = DriveApp.getFileById(newJobID);
newJobFile.AddEditors(['group@gmail.com','admin@gmail.com');
newJobFile.setOwner('admin@gmail.com');
最后一行是产生错误的地方。调试时,我可以看到创建变量时,我看不到有关它的任何信息。例如,如果我添加一个“Filecreated.getName();”在错误行之前,变量菜单保持空白。我不确定这是否正常。 “newid”变量已确认具有电子表格 ID。我可以将它复制到 URL 中,它会将我带到该页面。为什么这突然成为一个问题,我该如何解决?在使用 OAuthScopes 之前我没有 appscripts.json 文件,但它工作正常。我已经用适当的权限添加了它,但它没有改变任何东西。我已经添加了几个权限范围来尝试解决此问题,但其中 none 解决了这个问题。有什么建议吗?
"oauthScopes": [
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/spreadsheets"
]
编辑:我仍然遇到这个问题。即使一切都在一个帐户下控制,由于 'Exception : Access Denied : DriveApp',我不能 运行 将所有权转让给 'Central_account@gmail.com'。我在 Google App Script 组页面上发现只有一个人遇到了同样的问题。有没有其他人对从 4 月开始在普通的非工作帐户上转让所有权没有问题?运行
编辑 2:抱歉没有早点上传我的代码,我必须先清理它。
function onOpen(e) {
SpreadsheetApp.getUi()
.createMenu('Add') //creates toolbar entry to the right of 'Help'
.addItem('Capital project','newProject')
.addToUi();
}
function newProject(){
var dashboard = SpreadsheetApp.getActiveSpreadsheet(); //Stores dashboard into a variable for later
var template = SpreadsheetApp.openById('xxxxxx') //Opens the project sheet template in the backend
var nameEntry = getName(); //Prompts user for the name of the new job file
if (nameEntry == null){
return;
}
SpreadsheetApp.setActiveSpreadsheet(template); //Template is now the active sheet
var newJobID = copySheet(nameEntry); //Creates a copy of the New Project template
var newJobFile = DriveApp.getFileById(newJobID);
newJobFile.AddEditors(['group@gmail.com','admin@gmail.com');
newJobFile.setOwner('admin@gmail.com');
}
function getName(){
var ui = SpreadsheetApp.getUi();
var name = ui.prompt( //Prompts the user for an input name
'',
'?????-? Project Description',
ui.ButtonSet.OK_CANCEL);
var cancelCheck = name.getSelectedButton();
if (cancelCheck == ui.Button.CANCEL || cancelCheck == ui.Button.CLOSE) {
return null;
}
var sheetName = name.getResponseText();
return sheetName;
}
function copySheet(name) {
var activeSS = SpreadsheetApp.getActive();
var newFile = activeSS.copy(name) //Creates a copy of the New Project template
SpreadsheetApp.setActiveSpreadsheet(newFile); //Resets active spreadsheet to the recent copy
activeSS = SpreadsheetApp.getActive();
activeSS.getRange('A1').activateAsCurrentCell();
activeSS.getCurrentCell().setValue(name); //Set cell A1 to the name of the file
var newHyperlink = '=HYPERLINK("' + activeSS.getUrl() + '#gid=15580246",A1)';
activeSS.getRange('A2').activateAsCurrentCell();
activeSS.getCurrentCell().setValue(newHyperlink);
return activeSS.getId();
}
通过日志,我可以看到除 .setOwner() 方法外,一切都按预期工作。它 returns 拒绝访问错误。我检查了所有 google 个帐户,每个帐户都启用了 CustomScripts 来访问他们的驱动器。 .setOwner() 是否已针对非工作区帐户弃用?
我更新了原始代码段以匹配我的代码。
我没有足够的声誉来发表评论,但我支持 Lorena Gomez 所说的,这可能是您的 OAuthScopes 的问题。根据 Apps Script documentation,文件 class 上的 setOwner()
方法需要 /auth/drive 授权范围。
您似乎同时配置了 /auth/drive 和 /auth/drive.file 范围,我认为较窄的 /auth/drive.file 范围覆盖了较宽的范围/auth/drive 作用域,需要调用 setOwner()
.
您是否尝试过删除 /auth/drive.file 范围和 运行 仅使用 /auth/drive 的脚本?
显然,在消费者账户之间转移文件所有权的过程已经改变。据此guide,准新主人需要接受转让请求。请参见下面的示例:
而且我发现了这个article,你可以看到这个过程和几个月前不同,你可以立即设置一个新的所有者而无需发送邀请。
我用 Google Workspace 帐户测试了 setOwner() 方法,它在 Google Workspace 中工作,您可以直接在同一组织内的用户之间转移文件所有权,然后我测试了相同的方法使用 Gmail 帐户编写脚本并尝试将另一个 Gmail 帐户设置为新所有者,但我收到了相同的错误消息:“异常:访问被拒绝:DriveApp”。
根据所有信息,这种行为似乎是预料之中的,因为现在更改 Gmail 帐户的文件所有权的过程有所不同,您不能直接设置新的所有者,您邀请的人拥有文件必须接受您的请求才能完成传输。
我找不到关于 Google 在 2022 年 4 月更新政策的任何信息。此脚本之前运行没有任何问题,然后在一天中间,需要重新添加权限。即使有上述权限 g运行ted,Google 仍然说访问被拒绝。后来发现宏自3月31日起就没有运行成功
var newJobFile = DriveApp.getFileById(newJobID);
newJobFile.AddEditors(['group@gmail.com','admin@gmail.com');
newJobFile.setOwner('admin@gmail.com');
最后一行是产生错误的地方。调试时,我可以看到创建变量时,我看不到有关它的任何信息。例如,如果我添加一个“Filecreated.getName();”在错误行之前,变量菜单保持空白。我不确定这是否正常。 “newid”变量已确认具有电子表格 ID。我可以将它复制到 URL 中,它会将我带到该页面。为什么这突然成为一个问题,我该如何解决?在使用 OAuthScopes 之前我没有 appscripts.json 文件,但它工作正常。我已经用适当的权限添加了它,但它没有改变任何东西。我已经添加了几个权限范围来尝试解决此问题,但其中 none 解决了这个问题。有什么建议吗?
"oauthScopes": [
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/spreadsheets"
]
编辑:我仍然遇到这个问题。即使一切都在一个帐户下控制,由于 'Exception : Access Denied : DriveApp',我不能 运行 将所有权转让给 'Central_account@gmail.com'。我在 Google App Script 组页面上发现只有一个人遇到了同样的问题。有没有其他人对从 4 月开始在普通的非工作帐户上转让所有权没有问题?运行
编辑 2:抱歉没有早点上传我的代码,我必须先清理它。
function onOpen(e) {
SpreadsheetApp.getUi()
.createMenu('Add') //creates toolbar entry to the right of 'Help'
.addItem('Capital project','newProject')
.addToUi();
}
function newProject(){
var dashboard = SpreadsheetApp.getActiveSpreadsheet(); //Stores dashboard into a variable for later
var template = SpreadsheetApp.openById('xxxxxx') //Opens the project sheet template in the backend
var nameEntry = getName(); //Prompts user for the name of the new job file
if (nameEntry == null){
return;
}
SpreadsheetApp.setActiveSpreadsheet(template); //Template is now the active sheet
var newJobID = copySheet(nameEntry); //Creates a copy of the New Project template
var newJobFile = DriveApp.getFileById(newJobID);
newJobFile.AddEditors(['group@gmail.com','admin@gmail.com');
newJobFile.setOwner('admin@gmail.com');
}
function getName(){
var ui = SpreadsheetApp.getUi();
var name = ui.prompt( //Prompts the user for an input name
'',
'?????-? Project Description',
ui.ButtonSet.OK_CANCEL);
var cancelCheck = name.getSelectedButton();
if (cancelCheck == ui.Button.CANCEL || cancelCheck == ui.Button.CLOSE) {
return null;
}
var sheetName = name.getResponseText();
return sheetName;
}
function copySheet(name) {
var activeSS = SpreadsheetApp.getActive();
var newFile = activeSS.copy(name) //Creates a copy of the New Project template
SpreadsheetApp.setActiveSpreadsheet(newFile); //Resets active spreadsheet to the recent copy
activeSS = SpreadsheetApp.getActive();
activeSS.getRange('A1').activateAsCurrentCell();
activeSS.getCurrentCell().setValue(name); //Set cell A1 to the name of the file
var newHyperlink = '=HYPERLINK("' + activeSS.getUrl() + '#gid=15580246",A1)';
activeSS.getRange('A2').activateAsCurrentCell();
activeSS.getCurrentCell().setValue(newHyperlink);
return activeSS.getId();
}
通过日志,我可以看到除 .setOwner() 方法外,一切都按预期工作。它 returns 拒绝访问错误。我检查了所有 google 个帐户,每个帐户都启用了 CustomScripts 来访问他们的驱动器。 .setOwner() 是否已针对非工作区帐户弃用?
我更新了原始代码段以匹配我的代码。
我没有足够的声誉来发表评论,但我支持 Lorena Gomez 所说的,这可能是您的 OAuthScopes 的问题。根据 Apps Script documentation,文件 class 上的 setOwner()
方法需要 /auth/drive 授权范围。
您似乎同时配置了 /auth/drive 和 /auth/drive.file 范围,我认为较窄的 /auth/drive.file 范围覆盖了较宽的范围/auth/drive 作用域,需要调用 setOwner()
.
您是否尝试过删除 /auth/drive.file 范围和 运行 仅使用 /auth/drive 的脚本?
显然,在消费者账户之间转移文件所有权的过程已经改变。据此guide,准新主人需要接受转让请求。请参见下面的示例:
而且我发现了这个article,你可以看到这个过程和几个月前不同,你可以立即设置一个新的所有者而无需发送邀请。
我用 Google Workspace 帐户测试了 setOwner() 方法,它在 Google Workspace 中工作,您可以直接在同一组织内的用户之间转移文件所有权,然后我测试了相同的方法使用 Gmail 帐户编写脚本并尝试将另一个 Gmail 帐户设置为新所有者,但我收到了相同的错误消息:“异常:访问被拒绝:DriveApp”。
根据所有信息,这种行为似乎是预料之中的,因为现在更改 Gmail 帐户的文件所有权的过程有所不同,您不能直接设置新的所有者,您邀请的人拥有文件必须接受您的请求才能完成传输。