簡體   English   中英

綁定的 AppsScript Google 表格中超出 Memory 限制 function

[英]Memory limit exceeded in AppsScript Google Sheets bound function

您是否遇到過 Google Sheets 的所有者在運行綁定腳本時沒有出現“Exceeded memory 限制”錯誤,而同一文檔的編輯器卻出現這種情況?

我在 Google 表格中有一份報告,該報告是由於對 Google BigQuery 的 API 請求而創建的。 這是我的綁定腳本(我排除了完整的 SQLquery 文本,因為這不是問題):

function Report_detailed() {
   var t = new Array(0);
  var projectId = 'project_id';
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Detailed_report");
  var result = sheet; 
  var dateFrom =  Utilities.formatDate(new Date(SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Detailed_report").getRange("B1:B1").getValue()),"GMT+3", "yyyy-MM-dd");
  var dateTo =  Utilities.formatDate(new Date(SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Detailed_report").getRange("B2:B2").getValue()),"GMT+3", "yyyy-MM-dd");
  var lastRow = sheet.getLastRow();
  sheet.getRange(6,1,lastRow,55).clearContent(); 
  var cell = sheet.getRange("G6:BC");
  cell.setNumberFormat("0.00");
  var request = {
        query: 
'                SELECT * '+
'                FROM '+
'                `project_id.dataset_id.table_name` '+ 
'                WHERE '+    
'                date  BETWEEN "'+dateFrom+'" AND "'+dateTo+'" ',    
        useLegacySql: "FALSE",
  } ;
  t[0] = new Date();
  t[0] = 'Stage 1'+t[0];
  var queryResults = BigQuery.Jobs.query(request, projectId);
  t[1] = new Date();
  t[1] = 'Stage 2'+t[1];
  var jobId = queryResults.jobReference.jobId;

    // Check on status of the Query Job.
  var sleepTimeMs = 1000;
  var n = 0;
  while (!queryResults.jobComplete) {
    n = n + 1;
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
  }
  t[2] = new Date();
  t[2] = 'Stage 3'+t[2];
  Logger.log ('jobs');

  // Get all the rows of results.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
      pageToken: queryResults.pageToken,
    });
    rows = rows.concat(queryResults.rows);
  }
  t[3] = new Date();
  t[3] = 'Stage 4'+t[3];
  if (rows) {

    // Append the results.
    var data = new Array(rows.length);
    for (var i = 0; i < rows.length; i++) {
      var cols = rows[i].f;
      data[i] = new Array(cols.length);
      for (var j = 0; j < cols.length; j++) {
        data[i][j] = cols[j].v;
      }
    }
    t[4] = new Date();
    t[4] = 'Stage 5'+t[4];
      Logger.log ('datas');

    sheet.getRange(6, 1, rows.length, 55).setValues(data);
    t[5] = new Date();
    t[5] = 'Stage 6'+t[5];    
    Logger.log(t.join('\\n'));

    Logger.log('Results spreadsheet created: %s');
  } else {
    Logger.log('No rows returned.');
  }
  return n;
}

附加信息:

  1. 從 UI 調用 function。
  2. 查詢大小約為 100 MB,因此執行速度非常快。
  3. 前 4 個階段在 1-2 分鍾內運行
  4. 結果表有大約 25 000 行。 因此,該過程中最長的部分是為單元格設置值。
  5. 表格區域設置為美國,所有者在烏克蘭,文件的編輯在其他國家/地區。

當我從我的 Google 帳戶運行 function 時,一切正常,我在 5-6 分鍾內得到結果表。

但是,當我來自其他國家/地區的同事嘗試在他們的 Google 帳戶中刷新報告時,應用與我相同的日期范圍,他們沒有任何詳細解釋就出現“超出內存限制”。

你能幫我找出問題的根源嗎?

我會很感激任何線索和建議。 太感謝了!

故障排除

檢查文件訪問

您的所有用戶都可以訪問您嘗試檢索的數據嗎?

try catch封裝你的代碼

如果您的代碼由於查詢問題而失敗,請使用try catch將其封裝並Log錯誤。

監控執行並確定它在哪里中斷

使用Apps Script Debugger確定您的代碼在哪一步失敗,以及當它失敗時變量的樣子。

檢查配額和限制

檢查配額和限制並確定您是否超出了它們。 錯誤消息會指出您已超時或必須等待才能重試。

腳本執行超時

Apps 腳本也有自己的配額,請確保您的代碼可以在確定的時間范圍內執行。 特別是在處理數據輸入/輸出時,使用批處理操作很重要。

如果一切都失敗了......

聯系您所在域的 G Suite 支持

暫無
暫無

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

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