AppsScript Google表格绑定功能中超出了内存限制 脚本执行超时

您是否遇到过在运行绑定脚本时Google表格所有者没有“超出内存限制”错误的情况,而同一文档的编辑器却有这种情况吗?

我在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()),"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,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调用的。
  2. 查询大小约为100 MB,因此执行速度非常快。
  3. 前4个阶段在1-2分钟内运行
  4. 结果表大约有25000行。因此,此过程中最长的部分是设置单元格的值。
  5. Sheets的语言环境是美国,所有者在乌克兰,文件的编辑者在另一个国家。

当我从Google帐户运行该功能时,一切正常,然后在5-6分钟内得到了结果表。

但是,当来自其他国家/地区的同事尝试使用与我相同的日期范围刷新其Google帐户中的报告时,他们将“超出内存限制”,而没有任何详细说明。

您能帮我找到问题的根源吗?

任何线索和建议,我将不胜感激。 非常感谢!

tammyluxiuliang 回答:AppsScript Google表格绑定功能中超出了内存限制 脚本执行超时

问题排查

检查文件访问权限

您所有的用户都有权访问您要检索的数据吗?

try catch

封装代码

如果您的代码由于查询问题而失败,请用try catchLog错误将其封装。

监视执行情况并确定中断位置

使用Apps Script Debugger来确定代码在哪一步失败以及变量执行后的样子。

选中Quotas and Limits

检查配额和限制,并确定是否超出配额和限制。错误消息会指出您已超时或必须等待才能重试。

脚本执行超时

Apps脚本也有自己的quotas,请确保您的代码可以在确定的时间范围内执行。 特别是在处理数据输入/输出时,使用批处理操作很重要。

如果其他所有方法都失败了...

Contact G Suite Support for your domain。

本文链接:https://www.f2er.com/3110090.html

大家都在问