【问题标题】:Google Spreadsheet Cannot retrieve the next object: iterator has reached the endGoogle 电子表格无法检索下一个对象:迭代器已到达末尾
【发布时间】:2020-01-19 16:18:55
【问题描述】:

我有一个电子表格,用于列出每个客户的工作时间。我使用脚本制作工作表的 pdf,并直接将 pdf 放在与其刚刚创建的 pdf 相关的客户端文件夹中。它通过从电子表格中获取的客户端名称知道它需要使用哪个文件夹(电子表格中的名称与文件夹名称相同)。

一切都非常顺利...只要客户名称是 1 个单词(例如 WeSellApples),只要客户名称有更多单词(例如 We Do Not Sell Apples),我就会收到错误无法检索下一个对象:迭代器已经结束。

因为使用一个单词的名称,一切都完美无缺,我不知道为什么会发生这种情况。

function createPDF() {
   var sheet1 = SpreadsheetApp.getActiveSpreadsheet();
    var gebruikSheet1 = sheet1.getSheetByName("Urenregistratie maak pdf");
  var ui = SpreadsheetApp.getUi();
  var result = ui.alert( // Asks if I'm sure I want to save
      "Opslaan als PDF?",
      "Sla " +sheet1.getName()+ " " + "week " + gebruikSheet1.getRange("L6").getValue() + 
" " + gebruikSheet1.getRange("C6").getValue() +".pdf op als PDF", 
// Shows the name so I can double check if I selected the right client, 
// client name is in C6 en weeknumber in L6. Both cell values are dynamic (with Vlookup)
      ui.ButtonSet.OK_CANCEL);
  if (result == ui.Button.OK) {
    var hideSheet = sheet1.getSheetByName('Uren bijhouden'); 
// to make sure only the second sheet is exported as pdf
    hideSheet.hideSheet();
    var docblob = SpreadsheetApp.getActiveSpreadsheet().getAs("application/pdf"); 
    docblob.setName(sheet1.getName()+ " " + "week " + gebruikSheet1.getRange("L6").getValue() + 
" " + gebruikSheet1.getRange("C6").getValue() + ".pdf"); 

  var file = DriveApp.createFile(docblob);
    ui.alert(sheet1.getName()+ " " + "week " + gebruikSheet1.getRange("L6").getValue() 
+ " " + gebruikSheet1.getRange("C6").getValue() + " is opgeslagen"); 
  } else {
    ui.alert("Opslaan als .pdf is niet gelukt");
  }

  hideSheet.showSheet(); 


   // file to move
  var klantmap = gebruikSheet1.getRange("C6").getValue(); 
// the client name is in cell C6
  var id = DriveApp.getFoldersByName(klantmap).next().getId(); 
// script can find id of client folder without problem as long as client name 
// is one word
// this is the line where the error occures when client name contains more words
  Logger.log(id);

  DriveApp.getFolderById(id).addFile(file); // add file to client folder

  DriveApp.getRootFolder().removeFile(file); // removes file from root folder

}

我想收到一些提示,以便我自己找出问题所在。

【问题讨论】:

  • 经过测试,我注意到该行为可能是由于空格而发生的,无论文件夹名称中有多少单词,使用getFoldersByName() 都可以正常工作。但是,如果文件夹或搜索名称不完全匹配(可能在任一字符串的末尾有一个额外的空格),我会看到相同的错误,因为它没有找到具有该名称的“任何”文件夹。检查您从工作表中检索的字符串是否有多余的空格,另外,手动使用getFoldersByName() 和带有空格的文件夹的硬编码字符串名称进行检查。
  • 谢谢,我会做一些检查。
  • 您好,只是想检查一下问题是否已解决
  • 哦,是的,抱歉,空格确实有问题。我现在正在开发一个功能,如果它不存在,它会自动创建一个客户端文件夹,而不是手动创建文件夹以确保不再有错误。
  • 很高兴听到它解决了!至于创建文件夹,像这样创建文件夹会更好,这样你就会知道没有不需要的名称。

标签: google-apps-script google-sheets


【解决方案1】:

在这里重新组合后我注意到:

这一行:var docblob = SpreadsheetApp.getActiveSpreadsheet().getAs("application/pdf");

我觉得应该是这样的:var docblob = SpreadsheetApp.getActiveSpreadsheet().getBlob().getAs("application/pdf");

【讨论】:

  • .setName 发生的是 pdf 的名称。 Klantmap 是客户端文件夹名称。因此,使用 docblob.setName 将 .pdf 文件称为 Urenoverzicht 第 38 周 WeSellApples.pdf .. 使用 var klantmap 脚本会找到文件夹 WeSellApples。但当客户端名称有空格时则不然。
猜你喜欢
  • 2022-01-17
  • 2017-03-29
  • 2021-10-24
  • 2021-08-29
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多