gpt4 book ai didi

google-apps-script - 将所有权转移给编辑器时 File.setOwner() 返回 "Action not allowed"

转载 作者:行者123 更新时间:2023-12-01 21:56:18 24 4
gpt4 key购买 nike

我有一个谷歌脚本,用于根据谷歌电子表格中存储的数据生成文档。生成文档后,我尝试将所有者更改为其他 Gmail 帐户,但不断收到以下错误:

[15-09-23 09:55:09:480 PDT] File.setOwner([bob@gmail.com]) [1.03 seconds]

[15-09-23 09:55:09:566 PDT] Execution failed: Action not allowed (line 82, file "Helpers") [5.401 seconds total runtime]

我试图理解为什么我无法使用 Google 应用脚本更改所有者,但我可以通过 Google 云端硬盘手动更改所有者。

<小时/>

详细信息:

Bob (Bob@gmail.com) 与 Alice (Alice@gmail.com) 共享了他的云端硬盘上的目录。共享目录内有一个电子表格,用于根据电子表格的内容生成发票。 Alice 使用电子表格(她具有编辑权限)并调用电子表格上的“生成 > 发票”菜单操作来创建发票。由于她调用了该函数,该文件是以 Alice 为所有者创建的,但 Bob 希望成为所有发票的所有者。 Bob 尝试在创建文档后立即使用 Google App 脚本设置文档的所有者,但它返回了上面记录的错误。

<小时/>

电子表格内容:

 |     A      |     B     |
1| First Name | Last Name |
2| John | Doe |

Google 应用脚本:

/**
* Adds a menu-item to allow the generation of documents
*
* @param {Object} e The event parameter for a simple onOpen trigger.
*/
function onOpen(e) {
var menuitems = [];
menuitems.push({
name: "Invoice",
functionName: "createInvoice"
});
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.addMenu("Generate", menuitems);
}


/**
* This function reads data from cells A2:A3 to dynamically generate a document
*
*/
function createInvoice() {
var this_folder = cwd();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var content = sheet.getRange("A2:A3").getValues()[0].join(" ");

// Create a file with the given content
var file = DriveApp.createFile("Invoice", content);

// Add the file to the shared folder
this_folder.addFile(file);

// Remove the file from the user's root directory
DriveApp.getRootFolder().removeFile(file);

// Log the current owner of the document
Logger.log(file.getOwner().getName());

// Change the owner of the document from the active user to Bob.
file.setOwner("bob@gmail.com");
}


/**
* This is a helper function used to get the directory of the active spreadsheet.
*
*/
function cwd() {
var this_file = DriveApp.getFileById(SpreadsheetApp.getActive().getId());
return this_file.getParents().next();
}
<小时/>

重现步骤:

  1. 通过一个 Gmail 帐户与另一个 Gmail 帐户共享文件夹。
  2. 在与主 Gmail 帐户的共享文件夹中创建电子表格:
  3. 将 Google 应用脚本添加到电子表格中(将 setOwner 行更改为适当的电子邮件地址后)。
  4. 授予其他 Gmail 帐户写入权限。
  5. 登录其他 Gmail 帐户并加载文档。
  6. 调用脚本(生成 > 发票)。第一次执行此操作时,它会请求权限。
  7. 脚本应出现以下错误:

Action not allowed.

  • 如果您在调用脚本后打开脚本并查看日志,则会显示其他 Gmail 帐户拥有该文档并且应该能够更改它。
  • <小时/>

    其他信息:

    1. 如果我删除“file.setOwner()”方法,则会创建该文件,并且我可以通过网络界面手动设置更改所有者。
    2. 通过脚本和设置,我动态创建了文件夹,并能够使用 Google 应用脚本更改所有者。此问题似乎仅影响文件上的 setOwner() 方法。

    最佳答案

    来自问题(强调我的问题)

    Alice uses the spreadsheet (she has edit permissions) and invokes the "Generate > Invoice" menu action on the spreadsheet to create the invoice. Since she invoked the function, the file is created with Alice as the owner, but Bob wants to be the owner of all invoices. Bob has tried to set the owner of the document using Google App Script right after the document is created but it returns the error documented above.

    “Bob”无法转让文件的所有权,因为他不是所有者。更简单的方法是要求实际文件所有者“Alice”转移文件所有权。

    为了防止出现此问题,“Bob”可以使用 Google Apps 脚本创建一个 Web 应用程序,并将其设置为以他的身份执行,而不是使用自定义菜单。

    G Suite 帐户的另一种替代方法是创建一个具有域范围授权的服务帐户,以模拟“Alice”来转移文件的所有权。详情见 Peter Herman's answerTransfer ownership of a file to another user in Google Apps Script

    关于google-apps-script - 将所有权转移给编辑器时 File.setOwner() 返回 "Action not allowed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32746412/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com