google-apps-script - Google 脚本 - 异常 : Cannot retrieve the next object: iterator has reached the end

标签 google-apps-script google-sheets

我的 Google 电子表格中有以下脚本:

 /** 
     * Create CSV file of Sheet2
     * Modified script written by Tanaike
     * https://stackoverflow.com/users/7108653/tanaike
     * 
     * Additional Script by AdamD.PE
     * version 13.11.2022.1
     * https://support.google.com/docs/thread/188230855
     */
    
    const date = new Date();
    
    /** Extrai a data de hoje */
    let day = date.getDate();
    let month = date.getMonth() + 1;
    let year = date.getFullYear();
    
    
    if (day < 10) {
        day = '0' + day;
    }
    
    if (month < 10) {
        month = `0${month}`;
    }
    
    let currentDate = `${day}-${month}-${year}`;
    
    
    function sheetToCsvModelo0101() {
      var filename = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetName() + "-01" + " - " + currentDate; // CSV file name
      filename = filename + '.csv';
      var ssid=SpreadsheetApp.getActiveSpreadsheet().getId();
      var saveTo = DriveApp.getFileById(ssid).getParents().next().getId();
      
      // Tanaike script to create csv file
      var csv = "";
      var v = SpreadsheetApp
              .getActiveSpreadsheet()
              .getActiveSheet()
              .getRange("A2:AB3")
              .getValues();
      v.forEach(function(e) {
        csv += e.join(",") + "\n";
      });
    
      var newDoc = DriveApp.createFile(filename, csv, MimeType.CSV);
      var file = DriveApp.getFileById(newDoc.getId());
      DriveApp.getFolderById(saveTo).addFile(file);
      DriveApp.getRootFolder().removeFile(file);
    } 

可以在此处访问电子表格:Worksheet Test Script

此脚本基本上使用 .getRange("A2:AB3") 中定义的范围在工作表所在的同一文件夹中创建一个 .CSV 文件。

该脚本应用于第一个按钮并由它触发。

问题是,如果使用创建工作表的帐户以外的帐户按下按钮,脚本将返回错误异常:无法检索下一个对象:迭代器已到达末尾。

我已经检查过其他帐户是否有权访问电子表格所在的文件夹,以及他们是否有权编辑它,显然一切正常。

我该如何解决这个问题?

我的想法是由其他人编辑此电子表格并生成 .CSV 文件。

最佳答案

我认为在您的脚本中,当用户拥有 DriveApp.getFileById(ssid).getParents() 文件夹的写入权限时,该脚本可以正常工作。但是,在您的脚本中,有几个修改点。

  • addFile(child)removeFile(child) 已被弃用。 Ref请注意这一点。
  • 在您的脚本中,文件夹对象可直接用于创建文件。

当这些点反射(reflect)在你的脚本中时,下面的修改如何?

修改后的脚本:

在此修改中,修改了 sheetToCsvModelo0101

function sheetToCsvModelo0101() {
  var filename = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetName() + "-01" + " - " + currentDate; // CSV file name
  filename = filename + '.csv';
  var ssid = SpreadsheetApp.getActiveSpreadsheet().getId();

  // I modified below script.
  var folders = DriveApp.getFileById(ssid).getParents();
  var folder;
  if (folders.hasNext()) {
    folder = folders.next();
    var user = Session.getEffectiveUser().getEmail();
    if (!(folder.getOwner().getEmail() == user || folder.getEditors().some(e => e.getEmail() == user))) {
      throw new Error("This user has no write permission for the folder.");
    }
  } else {
    throw new Error("This user has no write permission for the folder.");
  }
  var csv = "";
  var v = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("A2:AB3").getValues();
  v.forEach(function (e) {
    csv += e.join(",") + "\n";
  });
  var newDoc = folder.createFile(filename, csv, MimeType.CSV);
  console.log(newDoc.getId()); // You can see the file ID.
}
  • 运行此脚本时,如果用户对该文件夹没有写入权限,则会显示类似此用户对该文件夹没有写入权限。 的错误。
    • 来自我已经检查了其他帐户是否有权访问电子表格所在的文件夹以及他们是否有权编辑它,显然一切都正常。,如果错误与文件夹的写权限,请再次确认。如果再次确认权限后仍然出现同样的错误,我认为需要考虑另一个问题。

引用:

关于google-apps-script - Google 脚本 - 异常 : Cannot retrieve the next object: iterator has reached the end,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74649696/

相关文章:

google-apps-script - Crud Webapp Google Apps 脚本

javascript - 如何从 Google Docs 文本文档的光标(或选择开始)到末尾进行选择?

javascript - For 循环增加其他变量太多次

regex - Google 表格中 googlefinance 功能支持的股票代码文档

javascript - 如何在App Script中正确使用setFormula

vba - 如何从 Excel 2003 VBA 写入 "Google Spreadsheet"

google-apps-script - 遍历文件夹和子文件夹/文件并将电子表格数据复制到存档表

javascript - Google Apps 脚本 : how to get the number of columns in a sheet?(替代方式)

google-apps-script - 每次调用gapi.auth.authorize的替代方法

regex - Excel 或 Google 公式计算文本字符串中 8 位数字的出现次数