将所有权转移到编辑器

时间:2015-09-23 17:58:35

标签: google-apps-script google-sheets google-drive-api

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

  

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

     

[15-09-23 09:55:09:566 PDT]执行失败:不允许采取行动(第82行,文件“助手”)[总运行时间为5.401秒]

我想了解为什么我无法使用Google App Script更改所有者,但我可以手动通过Google云端硬盘。

详细信息:

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

电子表格内容:

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

Google App脚本:

/**
 * 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 App脚本添加到电子表格中(将setOwner行更改为相应的电子邮件地址后)。
  4. 授予对其他Gmail帐户的写入权限。
  5. 从其他Gmail帐户登录并加载文档。
  6. 调用脚本(生成>发票)。第一次执行此操作时,它将要求权限。
  7. 脚本应该出错并出现以下错误:
  8.   

    不允许采取行动。

    1. 如果在调用脚本后打开脚本并查看日志,则会显示其他gmail帐户拥有该文档,并且应该能够更改它。
    2. 其他信息:

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

2 个答案:

答案 0 :(得分:1)

将文件放在Google云端硬盘的Team Drive文件夹中时,可能会发生此错误。

答案 1 :(得分:0)

从问题(强调我的问题)

Alice使用电子表格(她具有编辑权限),并在电子表格上调用“生成>发票”菜单操作来创建发票。由于她调用了该功能,因此该文件是由Alice作为所有者创建的,但是Bob希望成为所有发票的所有者。 Bob尝试在创建文档后立即尝试使用Google App脚本设置文档的所有者,但它会返回上面记录的错误。

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

为避免此问题,与其使用自定义菜单“ Bob”,还可以创建一个具有Google Apps脚本设置的Web应用程序,然后以他的身份执行该应用程序。

G Suite帐户的另一种选择是创建一个具有域范围内授权的服务帐户,以模拟“ Alice”来进行文件所有权的转移。有关详细信息,请参见Peter Herman's answerTransfer ownership of a file to another user in Google Apps Script