LoginSignup
0
0

More than 1 year has passed since last update.

GASを使ってSpreadSheetとBigQuery間のデータの受け渡しをする

Last updated at Posted at 2022-08-07

はじめに

GASを使って、SpreadSheetに入力した値を取得しBigQueryに登録したり
BigQueryから取得したデータをSpreadSheetに書き出したり
SpreadSheetとBigQuery間のデータの受け渡しをする方法をまとめました。

SpreadSheetの値の取得

// スプレッドシートを取得
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// シート名を指定してシートを取得
var sheet = spreadsheet.getSheetByName("sheet");
// 特定のセルの値を取得
var value = sheet.getRange("A1").getValue();

GASからBigQuery のクエリを実行する

「BigQuery API」を有効にする

BigQueryサービスを有効にすると、Google App ScriptからBigQuery APIが利用できるようになります。
API経由で、BigQueryのプロジェクト管理、データの追加、クエリの実行ができます。

image.png
image.png
image.png

公式ドキュメント

コード

insert.gs
function insert(value1, value2) {
  var query = `INSERT INTO \`bq_project.bq_dataset.bq_table\`(column1, column2)VALUES(${value1}, ${value2})`;
  execute(query);
}
select.gs
function select() {
  var query = "SELECT column1, column2 FROM `bq_project.bq_dataset.bq_table`";
  const result = execute(query);
  
  // 結果の件数は以下のように記述できる
  if (result.totalRows == '0') {
    Browser.msgBox(`取得結果0件。`);
    return;
  }
  
  let rows = []; // selectしたデータをループで格納する用の配列
  for (let i = 0; i < result.rows.length; i++) {
    let resultRow = result.rows[i];
    rows.push(
      [
        resultRow.f[0].v, // selectした1つ目のカラムを取得
        resultRow.f[1].v // selectした2つ目のカラムを取得
      ]
    );
  }
  
  // スプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // シート名を指定してシートを取得
  var sheet = spreadsheet.getSheetByName("sheet");
  // 以下のように記述するとselectした値をスプレッドシートに書き込める
  // 例:6行目1列目にselect取得結果を入力
  // getRange(row, column, numRows, numColumns)
  // setValues: 値を入力
  sheet.getRange(6, 1, rows.length, rows[0].length).setValues(rows);
}
execute_query.gs
function execute(query) {
  const project_id = "bq_project"; // クエリを実行するBQプロジェクト
  return BigQuery.Jobs.query(
    {
      useLegacySql: false,
      query: query
    },
    prject_id
  )  
}

パラメータが増えてコードが見づらくなった時の解決法

スプレッドシートから受け取ったパラメータで以下のようにINSERT文を構築すると、
受け取るパラメータが10個や20個と数が増えると以下のようにコードが見づらくなりました。

main.gs
function main() {
  // スプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // シート名を指定してシートを取得
  var sheet = spreadsheet.getSheetByName("sheet");
  
  var value1 = sheet.getRange("A1").getValue();
  var value2 = sheet.getRange("B1").getValue();
  var value3 = sheet.getRange("C1").getValue();
  var value4 = sheet.getRange("D1").getValue();
  var value5 = sheet.getRange("E1").getValue();
  var value6 = sheet.getRange("F1").getValue();
  var value7 = sheet.getRange("G1").getValue();
  var value8 = sheet.getRange("H1").getValue();
  var value9 = sheet.getRange("I1").getValue();
  var value10 = sheet.getRange("J1").getValue();

  // メソッドにパラメータ渡す
  // パラメータの数が増えるとどんどん横に長くなる
  insert(value1, value2, value3, value4, value5, value6, value7, value8, value9, value9, value10);

}

以下のようにパラメータを取得するClassを作成するとコードがすっきりして見やすくなりました。

parameters.gs
Class Parameters {
  constructor(sheet, value1, value2, value3, value4, value5, value6, value7, value8,value9, value10) {
    this.value1 = sheet.getRange("A1").getValue();
    this.value2 = sheet.getRange("B1").getValue();
    this.value3 = sheet.getRange("C1").getValue();
    this.value4 = sheet.getRange("D1").getValue();
    this.value5 = sheet.getRange("E1").getValue();
    this.value6 = sheet.getRange("F1").getValue();
    this.value7 = sheet.getRange("G1").getValue();
    this.value8 = sheet.getRange("H1").getValue();
    this.value9 = sheet.getRange("I1").getValue();
    this.value10 = sheet.getRange("J1").getValue();
  }
}
main.gs
function main() {
  // スプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // シート名を指定してシートを取得
  var sheet = spreadsheet.getSheetByName("sheet");  

  // パラメータ取得
  const parameters = new Parameters(sheet);
  // パラメータが増えてもParametersクラスをいじれば良いので以下のコードは変わらない
  insert(parameters);
  // パラメータを取り出す時は以下のようにすれば取り出せる
  // paranmeters.value1
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0