您是否遇到过在运行绑定脚本时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;
}
其他信息:
- 该函数是从UI调用的。
- 查询大小约为100 MB,因此执行速度非常快。
- 前4个阶段在1-2分钟内运行
- 结果表大约有25000行。因此,此过程中最长的部分是设置单元格的值。
- Sheets的语言环境是美国,所有者在乌克兰,文件的编辑者在另一个国家。
当我从Google帐户运行该功能时,一切正常,然后在5-6分钟内得到了结果表。
但是,当来自其他国家/地区的同事尝试使用与我相同的日期范围刷新其Google帐户中的报告时,他们将“超出内存限制”,而没有任何详细说明。
您能帮我找到问题的根源吗?
任何线索和建议,我将不胜感激。 非常感谢!