尝试复制文件时避免超出最长执行时间

时间:2013-04-07 14:19:26

标签: google-apps-script

嘿,这是我第一次在这里发帖,通常我会在这里找到答案,但这次我不得不问。

所以我正在尝试使用月份名称创建12个文件夹,并在每个文件夹中创建31个文件,这些文件是现有电子表格文件的副本。

我成功编写了有效的脚本,但是在创建3-4个月之后停止并抛出“超过最长执行时间”,现在我做了一些阅读,并了解有5分钟的时间限制 - 以及你可以在下面的代码中看到我做事的方式并不是最有效的,现在我唯一的想法就是将原始文件数据保存在blob中,然后在创建新文件时从该blob中读取 - 这样就避免了大量的调用和使事情变得更快,但当我尝试创建文件(blob)时,我得到PDF作为输出,这不是我的意图。

function create_months(month_name) 
{

  var testingfolder = DocsList.getFolder("testing");
  var targetFolder = testingfolder.createFolder(month_name);
  var mainDoc = DocsList.getFileById('original file id');

  for(var i=1;i<32;i++)
  {
    mainDoc.makeCopy(i).addToFolder(targetFolder);

    var root = DocsList.getRootFolder();
    var file = root.find(i);
    file[0].removeFromFolder(root);
  }


}
//array of months in hebrew
year = ['ינואר','פברואר','מרץ','אפריל','מאי','יוני','יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'];


function create(){

  for(var i=0;i<=12;i++)
  {
   create_months(year[i]);
  }
}

提前致谢:)

2 个答案:

答案 0 :(得分:0)

您的代码似乎没问题,除了create函数中的循环“错误1”(它应该是i < 12,而不是<=。如果您的脚本曾经有过最后,您undefinedmonth_name的{​​{1}}个create_months

如果你说3-4个月的工作,我建议你只做3个月的时间。如果你手动运行它。最简单的解决方案就是等待,然后再次运行,然后再运行,等等。

function create1stQuarter() {
  for( var i = 0; i < 3; ++i )
    create_months(year[i]);
}

function create2ndQuarter() {
  for( var i = 3; i < 6; ++i )
    create_months(year[i]);
}

function create3rdQuarter() {
  for( var i = 6; i < 9; ++i )
    create_months(year[i]);
}

function create4thQuarter() {
  for( var i = 9; i < 12; ++i )
    create_months(year[i]);
}

现在,如果你没有自己在脚本编辑器中运行它,或者你发现用户很难在电子表格菜单或其他地方点击4个itens。您可以通过自动设置触发器并在完成时自动将其删除来增强此功能。您还必须在脚本中跟踪您下一步必须创建的季度。这样简单的好地方是ScriptProperties

如果您正在使用触发器解决方案,我还建议您不要将时间间隔设置为低于10分钟,因为您可能会同时运行功能。如果您这样做,建议您使用LockService来保证不会发生这种情况。

答案 1 :(得分:0)

在循环之外做你能做的事情,并且因为你已经拥有该文件而摆脱了查找。

var root = DocsList.getRootFolder();

for(var i=1;i<32;i++)
  {
    var daily = mainDoc.makeCopy(i);
    daily.addToFolder(targetFolder);
    daily.removeFromFolder(root);
  }

这应该可以加快速度。