"setOwner" 不是函数错误 - 应用脚本

"setOwner" not a function error - App Script

Google 脚本的新手,我也浏览了 Stack Overflow 上的其他帖子,但找不到好的答案。

我正在使用 Google 表格中收集的数据在 Google 驱动器中搜索文件并转移文件的所有权。我有我的用户填写的 google 表单,一旦使用附加组件提交,我就会根据表单上提交的数据创建一个文件。现在使用脚本,我试图从工作表中收集某些信息,例如姓名、电子邮件和公司名称 - Sample data image here.

到目前为止我有:

function myFunction() {
//Get google sheets
  var spreadsheetId = '1WvIIoYdmuIB5BQ3KgSYOOIiEn-K_GTzCkb7rITzRFck';
  //get certain values from sheets
  var rangeName = 'MDP Form!C25:E';
  var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;
  if (!values) {
    Logger.log('No data found.');
  } else {
    Logger.log('Name, Email, Customer:');
    for (var row = 0; row < values.length; row++) {
      // Print columns C and E, which correspond to indices 0 and 4.
      Logger.log('Name: %s, Email: %s, Company: %s', values[row][0], values[row][1], values[row][2]);
      //Utilities.sleep(90000);
      //Searching through google drive 
      var name = (values[row][0]);
      var email = (values[row][1]);
      Logger.log(email);
      var company = (values[row][2]);
      var fileName = ('Mutual Delivery Plan ' + company + ' - ' + name);
      Logger.log(fileName);
      //add a 1 minute delay
      //Utilities.sleep(90000);
      //search for target folder
      var folder = DriveApp.getFolderById('1whvRupu9hWdyl2CqSF-KvdVj8VE6iiQu');
      //search for file by name within folder
      var mdpFile = folder.searchFiles(fileName);
      //transfer ownership
      mdpFile.setOwner(email);

    }
  }
}

问题:

除了最后一行 "setOwner" 不是函数,该脚本大部分都有效。我已经尝试为此创建一个单独的函数,在其他帖子中使用了一些其他建议,但仍然无法使它起作用。如果有人对我在这里可能遗漏的内容有任何想法,或者有非常有帮助的建议。谢谢!

Folder.searchFiles() returns 文件迭代器不是文件。如果它是唯一具有该名称的文件,那么您通常可以使用 mdpFile.next();

File Iterator

我相信你的目标如下。

  • 当在 folder 中找到具有 fileName 的文件时,您想转移文件的所有者。

为此,这个答案怎么样?

修改点:

虽然你说的是The script works for the most part except for the last line "setOwner" is not a function.,但是如果你问题中的脚本是当前脚本,那么下面的修改如何?

  • 在您的脚本中,fileName'Mutual Delivery Plan ' + company + ' - ' + namefileNamevar mdpFile = folder.searchFiles(fileName); 一起使用。在这种情况下,会发生错误。因为需要 params of searchFiles(params) 作为查询字符串。
    • 我认为你的情况是 "title='" + fileName + "'"
  • 还有searchFiles(fileName)returnsFileIterator 已经提到了这一点。因为在 Google Drive 中,相同的文件名可以存在于同一个文件夹中,并且每个文件都由唯一的 ID 管理。所以这里,需要修改如下。
    • 我认为在您的情况下,以下流程很有用。
      1. 使用hasNext()确认文件是否存在。
      2. 当文件存在且所有者为您时,文件的所有者更改为email

当以上几点反映到您的脚本中,请修改如下。

修改后的脚本:

从:
var mdpFile = folder.searchFiles(fileName);
//transfer ownership
mdpFile.setOwner(email);
到:
var mdpFile = folder.searchFiles("title='" + fileName + "'");
while (mdpFile.hasNext()) {
  var file = mdpFile.next();
  if (file.getOwner().getEmail() == Session.getActiveUser().getEmail()) {
    file.setOwner(email);
  }
}
  • 如果您不需要检查所有者是否是您,请删除if (file.getOwner().getEmail() == Session.getActiveUser().getEmail()) {

注:

  • 在这种情况下,当文件名为fileName的文件在folder中不存在时,if语句中的脚本不是运行。请注意这一点。
  • 此外,当 folder 中有多个同名文件时,这些文件的所有者将更改为 email

参考文献: