簡體   English   中英

Google表腳本超時錯誤

[英]Google sheet script timeout error

我正在嘗試從圖像中獲取文件名和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);
    };
};

當我看到你的問題時,我想象了2個模式。 但我認為你的情況有幾個答案。 所以請把它想象成兩個。

模式1:

  • 使用setValues()而不是appendRow()
    • 數據在while循環中創建。 並使用setValues()將數據放入Spreadsheet。

修改后的腳本

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
};

模式2:

  • 使用Drive API。
    • 使用Drive API檢索數據。 並使用setValues()將數據放入Spreadsheet。

要使用此示例腳本,請在高級Google服務和API控制台中啟用Drive API。 你可以在這里看到這個流程。

修改后的腳本

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
};

參考文獻:

如果這些不是你想要的,我很抱歉。

添加 :

通過@Steve Gon的評論why do you think SetValue is better than AppendRow? ,我添加了我提出setValues()而不是appendRow()

在此問題中,當檢索文件夾中的許多文件(超過3000個)並將其放入電子表格時,處理時間超過6分鍾,這是限制。 如果我的理解是正確的,我認為OP希望解決這個問題。 雖然我建議使用“setValues()”,因為我已經知道可以將帶有2列的10000行的值放到工作表中而沒有使用它的錯誤,我沒有在我的答案中顯示處理時間的差異。 我真的很抱歉。 所以我加了這個。

我為這種情況准備了2個示例腳本。 主要工作是將10,000行與2列放在一張紙上。 這大於3,000的問題。 那時,它測量setValues()appendRow()的處理時間。

使用setValues()的示例腳本

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);

使用appendRow()的示例腳本

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);

結果:

  • 當使用setValues()時,處理時間為2秒-3秒。 而且沒有錯誤。
  • 當使用appendRow()時,當值被設置為appendRow()行時,執行時間超過6分鍾。 雖然我曾多次嘗試過,但卻無法放置3000行。

這就是我提出setValues()的原因。

嘗試添加:if(cnt%500 === 0){SpreadsheetApp.flush();}

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();
            }

    };
};

在處理大型電子表格時,我注意到了很多問題。 我現在正在Google上開展一個項目,我聽說他們正在重寫解釋器/編譯器的運行方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM