【问题标题】:Wait for insert in BigQuery in AppsScript?等待在 Apps 脚本中插入 BigQuery?
【发布时间】:2026-01-13 14:50:01
【问题描述】:

我想等待 BigQuery 插入作业完成。在这个用例中,我正在对 Google Drive 中的 CSV 文件进行插入操作,这些文件可能非常大。

var res = BigQuery.Jobs.insert(job, projectId, data);

如果我有查询结果,我可以对 jobComplete 属性进行轮询,但在插入时没有。

例如,工作状态状态似乎永远不会是“正在运行”之外的任何东西。 因此,如何在此处等待或轮询插入以确保完成?

job = BigQuery.Jobs.insert(job, projectId, data);
var state = job.status.state;

// this never ends:
for( var sleep=128 ; state.equals('RUNNING') ; sleep*=2 ) {
  Logger.log(state);
  state = job.status.state;
  Utilities.sleep(sleep);
} // for 

【问题讨论】:

  • 这是一个教程的摘录job = BigQuery.Jobs.insert(job, projectId, data); Logger.log('Load job started. Check on the status of it here: ' + 'https://bigquery.cloud.google.com/jobs/%s', projectId); 教程在这里找到https://developers.google.com/apps-script/advanced/bigquery 我希望能有所帮助。抱歉,我无法提供更多帮助...我从未使用过 BigQuery
  • @Cooper,insert() 方法异步调用插入然后返回。在那里创建的 URL 只是一个到控制台的用户级链接,但不提供任何类型的其他接口来进行自省。
  • 我的印象是您可以轮询该 url 的状态。
  • @tehhowch 我刚刚更新了问题,但实际上 jobstatus.state 似乎从未改变,即使工作确实在后端完成。

标签: google-apps-script google-bigquery


【解决方案1】:

不确定您的插入是否与我的相同,但是,当我运行insert 语句时,我仍然使用BigQuery.Jobs.query() 命令。这让我仍然可以轮询 jobStatus 状态。

var sql = "Insert something ..etc";
try {
  var sqlJobResults = BigQuery.Jobs.query(request, projectId);
  } catch(e) {
    Logger.log("Error while running SQL: %s\n Stack: %s",sql, e.stack);
    throw e;
  }
  var jobId = sqlJobResults.jobReference.jobId;

  var sleepTimeMs = 500;
  var maxWaitMs = 60000;
  var waitedMs = 0;

  while (!sqlJobResults.jobComplete && waitedMs < maxWaitMs) {
    Utilities.sleep(sleepTimeMs);
    waitedMs += sleepTimeMs;
    sqlJobResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
  }

  if (waitedMs >= maxWaitMs) {
    Logger.log('SQL did not return within the time limit);
  } 

【讨论】: