使用关联工作表

关联工作表 是一项 Google 表格功能,可用于分析 BigQuery 和 Looker 数据 。 您可以使用关联工作表 以编程方式创建电子表格

“关联工作表”常用操作

使用 DataSource 类和对象连接到 BigQuery 或 Looker, 分析数据 下表列出了最常见的 DataSource 操作和 如何在 Apps 脚本中创建:

操作 Google Apps 脚本类 使用方法
将工作表连接到受支持的数据源 DataSourceSpec SpreadsheetApp.newDataSourceSpec()
选择数据源 DataSource Spreadsheet.insertDataSourceSheet().getDataSource()
添加数据源工作表 DataSourceSheet Spreadsheet.insertDataSourceSheet()
添加数据透视表 DataSourcePivotTable Range.insertDataSourcePivotTable()
将数据提取到提取内容中 DataSourceTable Range.insertDataSourceTable()
使用公式 DataSourceFormula Range.setFormula()
添加图表 DataSourceChart Sheet.insertDataSourceChart()

添加所需的授权范围

如需访问 BigQuery 数据,您必须添加 enableBigQueryExecution() 方法 。此方法会将所需的 bigquery.readonly 将 OAuth 范围应用于您的 Google Apps 脚本项目。

以下示例展示了 SpreadsheetApp.enableBigQueryExecution() 方法 在函数内调用:

function addDataSource() {
  SpreadsheetApp.enableBigQueryExecution();
  var spreadsheet = SpreadsheetApp.getActive();
  }

如需访问 Looker 数据,您必须在enableLookerExecution() 您的 Google Apps 脚本代码。在 Apps 脚本中访问 Looker 将重复使用您现有的 Google 账号关联 Looker。

以下示例展示了 SpreadsheetApp.enableLookerExecution() 方法 在函数内调用:

function addDataSource() {
  SpreadsheetApp.enableLookerExecution();
  var spreadsheet = SpreadsheetApp.getActive();
  }

向清单文件添加其他 OAuth 范围

与 BigQuery 连接时,系统会自动将大多数 OAuth 范围添加到 创建清单文件如果您需要更多 访问特定 BigQuery 数据的权限, 设置显式范围

例如,如要查询 Google 云端硬盘中托管的 BigQuery 数据,您必须在清单中添加云端硬盘 OAuth 范围 文件。

以下示例展示了清单文件的 oauthScopes 部分。它会将 云端硬盘 OAuth 范围以及所需的最低 spreadsheetbigquery.readonly 个 OAuth 范围:

{ ...
  "oauthScopes": [
    "https://www.googleapis.com/auth/bigquery.readonly",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/drive" ],
... }

示例:创建和刷新数据源对象

以下示例展示了如何添加数据源、创建数据 从数据源检索源对象,刷新数据源对象,然后获取 执行状态。

添加数据源

以下示例展示了如何添加 BigQuery 和 Looker 数据源 。

BigQuery

要将 BigQuery 数据源添加到电子表格,请插入包含 数据源规范数据源工作表会自动刷新以提取 预览数据。

将下面的 <YOUR_PROJECT_ID> 替换为有效的 Google Cloud 项目 ID。

// For operations that fetch data from BigQuery, enableBigQueryExecution() must be called.
SpreadsheetApp.enableBigQueryExecution();
var spreadsheet = SpreadsheetApp.create('Test connected sheets');
Logger.log('New test spreadsheet: %s', spreadsheet.getUrl());

// Build data source spec by selecting a table.
var dataSourceSpec = SpreadsheetApp.newDataSourceSpec()
    .asBigQuery()
    .setProjectId('<YOUR_PROJECT_ID>')
    .setTableProjectId('bigquery-public-data')
    .setDatasetId('ncaa_basketball')
    .setTableId('mbb_historical_tournament_games')
    .build();
// Add data source and its associated data source sheet.
var dataSourceSheet = spreadsheet.insertDataSourceSheet(dataSourceSpec);
var dataSource = dataSourceSheet.getDataSource();

Looker

如需将 Looker 数据源添加到电子表格,请插入包含 数据源规范数据源工作表会自动刷新以提取 预览数据。

替换以下内容中的 <INSTANCE_URL><MODEL_NAME><EXPLORE_NAME> 包含有效 Looker 实例网址、模型名称和探索名称的示例 。

// For operations that fetch data from Looker, enableLookerExecution() must be called.
SpreadsheetApp.enableLookerExecution();
var spreadsheet = SpreadsheetApp.create('Test connected sheets');
Logger.log('New test spreadsheet: %s', spreadsheet.getUrl());

// Build data source spec by selecting a table.
var dataSourceSpec = SpreadsheetApp.newDataSourceSpec()
    .asLooker()
    .setInstanceUrl('<INSTANCE_URL>')
    .setModelName('<MODEL_NAME>')
    .setExploreName('<EXPLORE_NAME>')
    .build();
// Add data source and its associated data source sheet.
var dataSourceSheet = spreadsheet.insertDataSourceSheet(dataSourceSpec);
var dataSource = dataSourceSheet.getDataSource();

添加数据源对象

将数据源添加到电子表格后,即可创建数据源对象 根据数据源创建的数据在本例中,数据透视表是使用 针对在以下创建日期中创建的 BigQuery dataSourceDataSourcePivotTable权限: 添加 BigQuery 数据源的代码示例

与通过单元格索引或 A1 引用的网格工作表中的常规数据不同 表示法中,来自数据源的数据通常通过列名称引用。 因此,数据源对象的大多数属性 setter 都使用列名称, 输入。

var rootCell = spreadsheet.insertSheet('pivotTableSheet').getRange('A1');

// Add data source pivot table and set data source specific configurations.
var dataSourcePivotTable = rootCell.createDataSourcePivotTable(dataSource);
var rowGroup = dataSourcePivotTable.addRowGroup('season');
rowGroup.sortDescending().setGroupLimit(5);
dataSourcePivotTable.addColumnGroup('win_school_ncaa');
dataSourcePivotTable.addPivotValue('win_pts', SpreadsheetApp.PivotTableSummarizeFunction.AVERAGE);
dataSourcePivotTable.addPivotValue('game_date', SpreadsheetApp.PivotTableSummarizeFunction.COUNTA);
var filterCriteria = SpreadsheetApp.newFilterCriteria()
    .whenTextEqualToAny(['Duke', 'North Carolina'])
    .build();
dataSourcePivotTable.addFilter('win_school_ncaa', filterCriteria);

// Get a regular pivot table instance and set shared configurations.
var pivotTable = dataSourcePivotTable.asPivotTable();
pivotTable.setValuesDisplayOrientation(SpreadsheetApp.Dimension.ROWS);

刷新数据源对象

您可以刷新数据源对象以从 BigQuery 中提取最新数据 管理数据。

数据刷新过程是异步进行的。如需刷新数据源对象,请执行以下操作: 使用以下方法:

  1. refreshData() 会启动数据刷新执行作业。
  2. waitForCompletion() 会在数据执行完成时返回结束状态 已完成。这样就无需不断轮询执行状态。
  3. 如果数据存在以下情况,DataExecutionStatus.getErrorCode() 会收到错误代码 执行失败。

以下示例展示了如何刷新数据透视表数据:

var status = dataSourcePivotTable.getStatus();
Logger.log('Initial state: %s', status.getExecutionState());

dataSourcePivotTable.refreshData();

status = dataSourcePivotTable.waitForCompletion(/* timeoutInSeconds= */ 60);
Logger.log('Ending state: %s', status.getExecutionState());
if (status.getExecutionState() == SpreadsheetApp.DataExecutionState.ERROR) {
  Logger.log('Error: %s (%s)', status.getErrorCode(), status.getErrorMessage());
}

将触发器与关联工作表搭配使用

使用触发器和事件,自动执行关联工作表数据源函数。 例如,使用时间驱动的触发器 在特定时间重复刷新数据源对象,并使用 电子表格事件触发器 来针对预定义事件触发数据执行。

以下示例添加了一个包含查询参数和 在修改查询参数时刷新数据源表格。

将下面的 <YOUR_PROJECT_ID> 替换为有效的 Google Cloud 项目 ID。

// Add data source with query parameter.
function addDataSource() {
  SpreadsheetApp.enableBigQueryExecution();
  var spreadsheet = SpreadsheetApp.getActive();

  // Add a new sheet and use A1 cell as the parameter cell.
  var parameterCell = spreadsheet.insertSheet('parameterSheet').getRange('A1');
parameterCell.setValue('Duke');

  // Add data source with query parameter.
  var dataSourceSpec = SpreadsheetApp.newDataSourceSpec()
      .asBigQuery()
      .setProjectId('<YOUR_PROJECT_ID>')
      .setRawQuery('select * from `bigquery-public-data`.`ncaa_basketball`.`mbb_historical_tournament_games` WHERE win_school_ncaa = @SCHOOL')
      .setParameterFromCell('SCHOOL', 'parameterSheet!A1')
      .build();
  var dataSourceSheet = spreadsheet.insertDataSourceSheet(dataSourceSpec);
  dataSourceSheet.asSheet().setName('ncaa_data');
}

// Function used to configure event trigger to refresh data source sheet.
function refreshOnParameterEdit(e) {
  var editedRange = e.range;
if (editedRange.getSheet().getName() != 'parameterSheet') {
  return;
}
// Check that the edited range includes A1.
if (editedRange.getRow() > 1 || editedRange.getColumn() > 1) {
   return;
}

  var spreadsheet = e.source;
  SpreadsheetApp.enableBigQueryExecution();
  spreadsheet.getSheetByName('ncaa_data').asDataSourceSheet().refreshData();
}

在上面的示例中,addDataSource() 函数将数据源添加到 电子表格。执行 addDataSource() 后,在以下位置创建事件触发器: Apps 脚本编辑器。如需了解如何创建事件触发器,请参阅可安装的触发器

为触发器选择以下选项:

  • 事件来源来自电子表格
  • 事件类型修改时
  • 要运行的函数refreshOnParameterEdit

创建触发器后,数据源工作表会自动刷新 每次修改参数单元格时都会触发。

问题排查

错误消息 分辨率
使用 enableBigQuery() 为 BIGQUERY 数据源启用数据执行。 此错误表示在提取 BigQuery 数据之前未调用 SpreadsheetApp.enableBigQueryExecution()
在使用 BigQuery 执行方法的函数中调用 SpreadsheetApp.enableBigQueryExecution()
例如,对数据源对象、Spreadsheet.insertDataSourceTable()DataSource.updateSpec() 执行 refreshData()
这些方法需要额外的 bigquery.readonly OAuth 范围才能运行。
您无权对数据源执行此操作。
请与您的管理员联系以启用此功能。
此错误表示该账号未启用关联工作表。
关联工作表仅供 Google Workspace 特定订阅的用户使用。
请与您的管理员联系以启用此功能。