【问题标题】:How can I get the folder ID of a folder in my drive using google script?如何使用谷歌脚本获取驱动器中文件夹的文件夹 ID?
【发布时间】:2018-03-14 15:58:40
【问题描述】:

对于我正在进行的一个项目,我创建了一个触发器来在每年年初运行我的 makeCopy() 函数。目标是制作电子表格的副本并将其保存在我的驱动器中已创建的文件夹中。在这个函数中,我还为新年创建了一个新文件夹。

function makeCopy(){

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var d = new Date();
  var year = d.getYear();
  var FolderName = "Time Off Request - " + year;

  DriveApp.createFolder(FolderName);

  year = year - 1;
  var FileName = "Copy of Time Off Request - " + year; 
  Logger.log(FolderName);
  FolderName = "Time Off Request - " + year;
  var FolderID = DriveApp.getFoldersByName(FolderName).next().getId();
  Logger.log(FolderID);

  var destFolder = DriveApp.getFolderById(FolderID);
  Logger.log(destFolder);


  DriveApp.getFileById(sheet.getId()).makeCopy(FileName, destFolder);

}

这段代码实际上是第一次运行和工作。但是,每次我尝试再次测试它时,我都会收到错误消息,“无法检索下一个对象:迭代器已到达末尾。”在我尝试获取文件夹 ID 的那一行。如何修复此错误并获取驱动器中文件夹的文件夹 ID,以便将电子表格复制到该文件夹​​。

【问题讨论】:

  • 您在定义之前记录文件夹名称...名称可能不正确,否则您的代码应该可以正常运行。您可以使用 try/catch 结构来防止错误停止执行。
  • 我在记录之前在脚本顶部定义了文件夹名称。然后我重新定义它,以便年份发生变化,因为正在创建的文件夹具有相同的名称,只是提前一年,这是唯一的区别。
  • 是的,我发现了错误,Serge!文件夹名称不正确。

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


【解决方案1】:

您会收到特定错误Cannot retrieve the next object: iterator has reached the end.,因为搜索该文件夹名称会产生一个空结果集。 如果您将程序结构更改为仅使用 next() 如果迭代器的 hasNext() 方法返回 true,您将不会再收到该错误。但是,这样的改变不会让你的搜索词突然找到结果。但是,它确实允许对不同的搜索查询进行重复尝试。

我建议重命名变量以表达其意图:

// Copy the current file into last year's folder, and create this year's folder.
function makeCopy() {
  var now = new Date();
  var thisYear = now.getYear();
  var lastYear = thisYear - 1;

  var query = "Time Off Request - " + lastYear;
  var folderIterator = DriveApp.getFoldersByName(query);
  // Instead of throwing an error, you could modify this to be a while loop
  // that requests a search term from the user - see Browser/UI and inputBox
  // and updates folderIterator. If you do that, you'll want to add guards
  // that ensure the correct folder will be the first result.
  if (!folderIterator.hasNext()) {
    throw new Error("Bad search term - no folders with name '" + query + "' exist!");
  }

  var lastYearFolder = folderIterator.next();
  console.log({message: "Backup of Time Off Requests",
               query: query,
               destFolder: lastYearFolder.getName()}
  ); // View->Stackdriver Logging

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var backupName = "Copy of Time Off Request - " + lastYear; 
  DriveApp.getFileById(sheet.getId()).makeCopy(backupName, lastYearFolder);

  // Before exiting, now that the backup is done, create this year's folder.
  DriveApp.createFolder("Time Off Request - " + thisYear);
}

【讨论】:

    【解决方案2】:

    createFolder 返回一个文件夹对象,但代码没有利用这一点。而不是

    DriveApp.createFolder(FolderName);
    

    使用

    var myFolder =  DriveApp.createFolder(FolderName);
    

    然后获取文件夹 id 使用getId

    var FolderID = myFolder.getId();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多