【问题标题】:"setOwner" not a function error - App Script“setOwner”不是函数错误 - 应用脚本
【发布时间】:2020-05-28 06:00:38
【问题描述】:

刚接触 Google Scripts,我也浏览过 Stack Overflow 上的其他帖子,但找不到好的答案。

我正在使用在 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”不是函数外,该脚本大部分都可以工作。我已经尝试为此创建一个单独的函数,在其他帖子上使用了一些其他建议,但仍然无法使其正常工作。如果有人对我可能在这里遗漏的内容有任何想法,或者有非常有用的建议。谢谢!

【问题讨论】:

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


    【解决方案1】:

    我相信你的目标如下。

    • 当在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); 一起使用。在这种情况下,会发生错误。因为searchFiles(params)params 必须是查询字符串。
      • 我认为在你的情况下,它是"title='" + fileName + "'"
    • 同样searchFiles(fileName) 返回FileIteratorthe existing answer 已经提到了这一点。因为在 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()) {

    注意:

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

    参考资料:

    【讨论】:

      【解决方案2】:

      Folder.searchFiles() 返回一个 fileIterator 而不是一个文件。如果它是唯一具有该名称的文件,那么您通常可以使用 mdpFile.next();

      File Iterator

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多