使用 Google Big Query 在 Google App 脚本上超过最大执行时间

Posted

技术标签:

【中文标题】使用 Google Big Query 在 Google App 脚本上超过最大执行时间【英文标题】:Exceeded maximum execution time on Google App script with Google Big Query 【发布时间】:2013-12-09 18:05:15 【问题描述】:

如何在下面的代码中延长执行时间。本质上,我使用 Google App 脚本从我们的大查询数据库中查询数据并将数据导出到 Google 电子表格。

以下是我的代码:

函数 Weekly_Metric()

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetName = "Budget";
var sheet = ss.getSheetByName(sheetName);
ss.setActiveSheet(sheet);
var sql = ' bigqueryscript ';
var results = GSReport.runQueryAsync(sql);
var resultsValues = GSReport.parseBigQueryAPIResponse(results); 
sheet.clear();
ss.appendRow(["Label1", "Label2", "Label3"]);

 for ( var i = 0 ; i < resultsValues.length ; i++ ) 
  ss.appendRow(resultsValues[i]);
 

【问题讨论】:

【参考方案1】:

始终尽可能减少对 Google Apps 脚本服务的调用次数。

在这种情况下,包含appendRow() 的循环可以替换为javascript 数组操作和对setValues() 的一次调用。

...
sheet.clear();

var data = [];
data.push(["Label1", "Label2", "Label3"]);
for ( var i = 0 ; i < resultsValues.length ; i++ ) 
  data.push(resultsValues[i]);

ss.getRange(1,1,data.length,data[0].length).setValues(data);
...

或者,如果resultsValues 已经是一个行数组,您只需添加标签:

...
sheet.clear();

resultsValues.unshift(["Label1", "Label2", "Label3"]);
ss.getRange(1,1,resultsValues.length,resultsValues[0].length).setValues(resultsValues);
...

如果这不起作用,那么您应该查看 GSReport 对象的方法。

【讨论】:

【参考方案2】:

这篇文章很好地回答了如何在 AppsScripts 中运行耗时超过 5 分钟的异步调用:

Exceeded maximum execution time in Google Apps Script

我想知道为什么调用 BigQuery 的时间超过 5 分钟?

【讨论】:

很明显,需要时间的不是对 BigQuery 的调用……而是循环中的电子表格调用。查看其他答案。

以上是关于使用 Google Big Query 在 Google App 脚本上超过最大执行时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Big Query 中总结月份?

在 Google Big Query 中使用 bq 命令行执行查询

如何在 Google Big Query 中正确使用 GROUP BY 命令?

使用 Google Big Query 构建基本漏斗

Google Big Query 中的第二个子字符串

使用 Big Query 信息创建 Google App Function