首页 > 解决方案 > 谷歌脚本 DriveApp.getFolders().hasNext() 错误

问题描述

如果它不存在,我想在驱动器中创建一个目录。

function CreateDirectory() {
  var folderName="Example";
  var Directory;
  var fi = DriveApp.getFoldersByName(folderName);
  if (fi.hasNext()) {
    Directory = fi.next();
  } else {
    Directory = DriveApp.createFolder(folderName);
  }
}

达到条件时函数停止:

抱歉,发生了服务器错误。请稍等,然后重试。

有什么问题,如何解决?

标签: google-apps-scriptgoogle-drive-apiserver-error

解决方案


您的代码没有任何问题。

Google 无法保证 100% 的服务可用性。

解释:

该错误告诉您在再次执行该功能之前需要稍等片刻。

一个潜在的解决方法是使用 try...catch语句,并在括号内包含一段代码,以便在一段时间后catch自动执行该函数。

例如, 如果函数第一次失败,您可以创建一个时间驱动的 触发器CreateDirectory(),该触发器在一段时间(例如 1 分钟)后执行。


解决方案:

在以下解决方案中,逻辑是手动执行该toRun()功能。后者将尝试执行CreateDirectory()。如果发生错误,它将创建一个时间驱动的触发器,该触发器将CreateDirectory()在一分钟后执行(根据您的需要进行修改)。该clearTrigger()函数负责清除由于该代码而创建的所有先前的触发器(如果有的话)。

function toRun(){

  try{
    CreateDirectory();
  }
  
  catch (e){
    
     clearTrigger(); // clear previous created triggers
     ScriptApp.newTrigger("CreateDirectory") 
     .timeBased()
     .after(1 * 60 * 1000) // execute CreateDirectory after 1 minute
     .create();
  } 
 
}

function CreateDirectory() {
  var folderName="Example";
  var Directory;
  var fi = DriveApp.getFoldersByName(folderName);
  if (fi.hasNext()) {
    Directory = fi.next();
  } else {
    Directory = DriveApp.createFolder(folderName);
  }
}

function clearTrigger(){

var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
  if (triggers[i].getHandlerFunction() == "CreateDirectory") {
    ScriptApp.deleteTrigger(triggers[i]);
  }
}
}

推荐阅读