有没有办法在仅附加模式下使用 Google Apps 脚本将数据从 BigQuery 加载到 Google 表格?

Posted

技术标签:

【中文标题】有没有办法在仅附加模式下使用 Google Apps 脚本将数据从 BigQuery 加载到 Google 表格?【英文标题】:Is there a way to load data from BigQuery to Google Sheets with Google Apps Script on append-only mode? 【发布时间】:2021-07-20 14:06:18 【问题描述】:

由于业务/运营需要,我一直在处理从 BQ 到 GSheets 的数据提取,但我想尽可能地自动化它。

我创建了一个查询,用于提取给定实体的最近 24 小时事件,我希望相关人员只能看到这些最近 24 小时事件。问题是,鉴于我正在使用的 GoogleApps 脚本(您将在下面找到),我找不到附加结果的方法:每次运行 GoogleApps 脚本时,结果都会被覆盖。

我找到了writeDisposition,但它似乎只适用于表格:/

顺便说一句,我想附加结果,因为我需要保存和堆叠周末数据。这个想法是,当人们抓取 gsheets 中的数据时,他们将其删除并等待第二天的新数据。

非常感谢!

GoogleApps 脚本:

function runQuery() 
  var projectId = '123456789';
  

  var request = 
    query: 'SELECT * FROM `mytable.example`',
    useLegacySql: "false"
  ;
  var queryResults = BigQuery.Jobs.query(request, projectId);
  var jobId = queryResults.jobReference.jobId;


  // 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);
  

  if (rows) 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadsheet.getSheetByName('query_results');

    // Append the headers.
    var headers = queryResults.schema.fields.map(function(field) 
      return field.name;
    );
    //sheet.appendRow(headers);

    // 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;
      
    
    
    sheet.getRange(2, 1, rows.length, headers.length).setValues(data);
    Logger.log(data.length);
    Logger.log('Results spreadsheet created: %s',
        spreadsheet.getUrl());
   else 
    Logger.log('No rows returned.');
  

【问题讨论】:

【参考方案1】:

要将当前数据附加到工作表的最后一行,请使用以下示例代码:

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('query_results');
sheet.getRange(sheet.getLastRow()+1, 1, data.length, data[0].length).setValues(data);

它有什么作用?

    使用getLastRow()获取工作表的最后一行索引 选择要写入新数据的范围,将最后一行加 1,作为要添加的新数据的起始行。

【讨论】:

如果您遇到一些问题,请告诉我,以便我进行相应更新。由于缺少样本数据,我无法重现您的问题。 是的,这确实有效!在我之前的查询中,我将 getRange() 设置为 2(第 2 行),而使用 getLastRow()+1 可以解决问题!谢谢:D

以上是关于有没有办法在仅附加模式下使用 Google Apps 脚本将数据从 BigQuery 加载到 Google 表格?的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 问题无法在仅承载模式下交换代码以获得授权

使用 keycloak-nodejs-connect 时出错 - “无法在仅承载模式下交换代码以获取授权”

(Xamarin iOS):ExecutionEngineException - 在仅 aot 模式下运行时尝试 JIT 编译方法

VMware虚拟机在仅主机模式下的网卡无法动态获取IP

VMware虚拟机在仅主机模式下的网卡无法动态获取IP

如何在仅横向模式下创建 iPad 应用程序?