Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌工作表脚本超时错误_Javascript_Google Apps Script_Google Sheets_Google Drive Api - Fatal编程技术网

Javascript 谷歌工作表脚本超时错误

Javascript 谷歌工作表脚本超时错误,javascript,google-apps-script,google-sheets,google-drive-api,Javascript,Google Apps Script,Google Sheets,Google Drive Api,我正在尝试从图像中获取文件名和ID,有3000多个图像,这个数字将继续增加 我在网上有一段代码,运行得很好。但是,问题是脚本在完成获取所有图像之前总是会超时 所以我想知道是否有一种方法可以从上一节课的地方继续下去。 我知道有很多解决会话超时问题的答案,但我的javascript不够熟练,不知道如何编写它们 谢谢 这是我的密码 function listFilesInFolder(folderName) { var sheet = SpreadsheetApp.getActiveSheet

我正在尝试从图像中获取文件名和ID,有3000多个图像,这个数字将继续增加

我在网上有一段代码,运行得很好。但是,问题是脚本在完成获取所有图像之前总是会超时

所以我想知道是否有一种方法可以从上一节课的地方继续下去。 我知道有很多解决会话超时问题的答案,但我的javascript不够熟练,不知道如何编写它们

谢谢

这是我的密码

function listFilesInFolder(folderName) {

   var sheet = SpreadsheetApp.getActiveSheet();
   sheet.appendRow(["Name", "File-Id"]);


//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
    var folder = DriveApp.getFolderById("ID");
    var contents = folder.getFiles();

    var cnt = 0;
    var file;

    while (contents.hasNext()) {
        var file = contents.next();
        cnt++;
            data = [
                file.getName(),
                file.getId(),
            ];
            sheet.appendRow(data);
    };
};

当我看到你的问题时,我想象了两种模式。但我认为对你的情况有几个答案。所以请把这看作其中的两个

模式1:
  • 使用
    setValues()
    而不是
    appendRow()
    • 数据是在while循环中创建的。并使用
      setValues()
      将数据放入电子表格
修改脚本: 模式2:
  • 使用驱动API。
    • 使用驱动器API检索数据。并使用
      setValues()
      将数据放入电子表格
为了使用此示例脚本,请在高级Google服务和API控制台启用驱动器API。你可以在网站上看到这个流程

修改脚本: 参考资料:
如果这些不是你想要的,我很抱歉

补充: 通过对
为什么您认为SetValue比AppendRow好?
的评论,我添加了我建议
setValues()
而不是
AppendRow()
的原因

在本期中,当检索文件夹中的多个文件(超过3000个)并将其放入电子表格时,处理时间超过6分钟,这是限制。如果我的理解是正确的,我认为OP想要解决这个问题。虽然我建议使用“setValues()”,因为我知道使用它可以将包含2列的10000行的值放在一个工作表中而不会出错,但我在回答中没有说明处理时间的差异。对此我真的很抱歉。所以我加了这个

我为这种情况准备了两个示例脚本。主要工作是将10000行2列放入一张工作表。这是超过3000的问题。此时,它测量
setValues()
appendRow()
的处理时间

使用setValues()的示例脚本
var label=“sampleLabel”
控制台。时间(标签);
var行=10000;
var值=[];
对于(变量i=0;i
使用appendRow()的示例脚本
var label=“sampleLabel”
控制台。时间(标签);
var行=10000;
var ss=SpreadsheetApp.getActiveSheet();
对于(变量i=0;i
结果:
  • 使用
    setValues()
    时,处理时间为2秒-3秒。而且没有错误
  • 使用
    appendRow()
    时,当该值设置为1400-1500行时,执行时间超过6分钟。虽然我试了好几次,但还是放不下3000行
这就是我建议的原因。
setValues()
如果(cnt%500==0){SpreadsheetApp.flush();}


在使用大型电子表格时,我注意到了很多问题。我现在在谷歌做一个项目,听说他们正在重新编写解释器/编译器的运行方式。

@SteveGon appendRow一次只能添加一行,而setValues可以一次添加多行。@Steve Gon感谢您的建议。根据你的建议,我可以更新我的答案。你能确认一下吗?我的两个变通方法是几个答案中的两个。因此,我认为您的变通方法也很重要。@Steve Gon顺便说一句,在您关于
的评论中,我对大型电子表格上的SetValue比AppendRow有更多的问题。
,我对此很感兴趣。因为我认为这些信息对于使用
setValues()
的用户很有用。因此,能否请您提供大量问题的详细信息,以及一个示例情况,包括复制问题的脚本?我想你说的是关于
setValues()
的重要问题。如果您的回答是,
setValues()
不能用于OP的情况,我想提出使用Sheets API的方法。@Rubén感谢您的支持。我这样提议是因为我和你有相同的意见。因为我在回答中没有说明
setValues()
appendRow()
的处理时间的差异,所以我补充了这一点。你能确认一下吗?我想要强调的特点是,SpreadsheetApp方法比JavaScript方法慢一点,appendRow应该为每一行使用一次,而SetValue可以为数千行使用一次。我更新了我的答案,因为我没有说明我的答案中
setValues()
appendRow()
的处理时间。所以我补充了这一点。你能确认一下吗?
function listFilesInFolder(folderName) {
  var data = [["Name", "File-Id"]];
  var folder = DriveApp.getFolderById("ID"); // Please set this.
  var contents = folder.getFiles();
  while (contents.hasNext()) {
    var file = contents.next();
    data.push([file.getName(), file.getId()]);
  };
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data); // Modified
};
function listFilesInFolder2(folderName) {
  var folderId = "ID"; // Please set this.
  var data = [["Name", "File-Id"]];
  var params = {
    'pageSize': 1000,
    'q': "'" + folderId + "' in parents and mimeType!='" + MimeType.FOLDER + "'",
    'fields': "nextPageToken,items(id,title)"
  };
  do {
    var r = Drive.Files.list(params);
    params["pageToken"] = r.nextPageToken;
    r.items.forEach(function(e) {data.push([e.title, e.id])});
  } while(r.nextPageToken);
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data); // Modified
};
var label = "sampleLabel"
console.time(label);
var rows = 10000;
var values = [];
for (var i = 0; i < rows; i++){
  values.push(["Name", "File-Id"]);
}
var ss = SpreadsheetApp.getActiveSheet();
ss.getRange(ss.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
console.timeEnd(label);
var label = "sampleLabel"
console.time(label);
var rows = 10000;
var ss = SpreadsheetApp.getActiveSheet();
for (var i = 0; i < rows; i++){
  ss.appendRow(["Name", "File-Id"]);
}
console.timeEnd(label);
function listFilesInFolder(folderName) {

   var sheet = SpreadsheetApp.getActiveSheet();
   sheet.appendRow(["Name", "File-Id"]);


//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
    var folder = DriveApp.getFolderById("ID");
    var contents = folder.getFiles();

    var cnt = 0;
    var file;

    while (contents.hasNext()) {
        var file = contents.next();
        cnt++;
            data = [
                file.getName(),
                file.getId(),
            ];
            sheet.appendRow(data);
            if (cnt % 500 ===0){
              SpreadsheetApp.flush();
            }

    };
};