0

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

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

我已经成功编写了有效的脚本,但是在创建 3-4 个月后它停止并抛出“超过最大执行时间”,现在我做了一些阅读并了解到有大约 5 分钟的时间限制 - 正如你所看到的在下面的代码中,我的处理方式可能不是最有效的,现在我唯一的想法是将原始文件数据保存在 blob 中,然后在创建新文件时从该 blob 中读取 - 这样可以避免大量调用并使事情变得更快,但是当我尝试 createFile(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]);
  }
}

提前致谢 :)

4

2 回答 2

0

您的代码看起来不错,除了create函数中循环上的“error by 1”(应该是I ,而i < 12不是<=.undefinedmonth_namecreate_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 个项目。您可以通过自动设置触发器并在完成后自动删除它来增强此功能。您还必须在脚本中跟踪下一个必须创建的季度。像这样简单的东西的好地方是ScriptProperties

如果您使用的是触发器解决方案,我还建议您不要将时间间隔设置为低于 10 分钟,因为您将面临函数同时运行的风险。如果这样做,建议您使用LockService来保证不会发生这种情况。

于 2013-04-07T23:01:56.807 回答
0

由于您已经拥有该文件,因此在循环之外尽您所能并摆脱查找。

var root = DocsList.getRootFolder();

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

那应该加快速度。

于 2013-04-08T01:34:39.277 回答