使用 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 中使用 bq 命令行执行查询