以前工作 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 帐户的文件所有权的过程有所不同,您不能直接设置新的所有者,您邀请的人拥有文件必须接受您的请求才能完成传输。