Google Spreadsheet/GAS で BigQueryのテーブル一覧情報を抜き出す

# この記事の趣旨
Google Spreadsheetから呼べるGASで、BigQueryのテーブルメタ情報を引き出し、一覧表示します。
BigQueryのテーブルメタ情報をGASで扱ってみよう。

# 準備
Google Spreadsheetを開き、こんな感じでセルを埋めて、シート名を「基本情報」に変更してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12857/b2f82117-ce1b-1538-1276-e765e87e5bd4.png)

# 追加メニューの追加
Spreadsheetに機能の呼び出しトリガーとなるメニュー項目を追加します。Spreadsheetを開き、ツールメニューからスクリプトエディタを選ぶと出てくるエディタで次のコードを入力し、保存ボタンをクリックしてください。

```js:コード.gs
function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [{name:'データセット・テーブル一覧',functionName:'onCreateTableList'}
             ];
  spreadsheet.addMenu('追加機能',menu);
}
```
するとこんな画面でプロジェクト名を聞いてくるのでなんか入れてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12857/7733d40e-de12-e41b-6d42-f59227767072.png)
次に時計のマークをクリックしてトリガーを追加。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12857/7fc8fbf6-78bf-b5b9-f00b-d0bc20c0dcac.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12857/d29c7642-95f5-cd0e-c5d0-062cd6ee5dcf.png)
スプレッドシート起動時のトリガーを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12857/00027971-b90f-c65d-f27e-a16bdcd8daaa.png)

保存をクリックすると、権限とか聞いてくるので良しなにOKしてください。

# BigQuery APIの有効化
GASエディタの「リソース」メニューから、「Google の拡張サービス...」を選択し、BigQuery API を有効可してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12857/7fc3416d-d444-72da-2750-79b36417921c.png)
BigQueryを有効可すると、ダイアログの下にGoogle Cloud Platformのダッシュボードで有効可してくれ、とメッセージが表示されるので、リンクをクリックし、対象プロジェクトのダッシュボードに飛び、![image.png](https://qiita-image-store.s3.amazonaws.com/0/12857/df81104c-4aae-a09b-541d-1fe6b71b08ef.png)をクリックしてください。

GoogleのAPIはたくさんあって探すのが大変なので検索しましょう。BigQueryで検索するとだいぶ絞り込まれますので、BiqQueryAPIを選んで有効化してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12857/92d91f3b-4757-0eb9-cfe2-c5dcf08d35cc.png)




# 実コード
GASエディタに戻って次のコードを追加します。

```js

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var configsheet = spreadsheet.getSheetByName('基本情報');

// BigQueryに問い合わせ
function onCreateTableList() {
  var projectId = configsheet.getRange(1, 2).getValue();
  var dataSets = BigQuery.Datasets.list(projectId);
  if ( dataSets.datasets.length > 0 ) {
    var tablesArray = [];
    // 表示バッファを埋める
    dataSets.datasets.forEach(function(dataset){
      var cols = [];
      cols.push(dataset.datasetReference.datasetId);
      cols.push(dataset.location);
      cols.push("");
      cols.push("");
      cols.push("");
      tablesArray.push(cols);
      var tables = BigQuery.Tables.list(projectId, dataset.datasetReference.datasetId);
      tables.tables.forEach(function(table){
        var tableDetail = BigQuery.Tables.get(projectId, 
                             dataset.datasetReference.datasetId,
                             table.tableReference.tableId);
        var cols = [];

        var date = new Date();
        date.setTime(table.creationTime);
        cols.push("");
        cols.push(tableDetail.tableReference.tableId);
        cols.push(tableDetail.type);
        cols.push(date.toString());
        cols.push(tableDetail.numBytes);
        tablesArray.push(cols);
      });
    });
  
    // 表示する
    configsheet.getRange(3, 1, tablesArray.length, 5).setValues(tablesArray);
  }
}
```

シートに戻ってリロードしてください。メニューに「追加機能」が追加されているはずです。B1セルにGCPプロジェクトIDを入れて、データセット・テーブル一覧を選んで動かしてみましょう。

許可が必要、とか聞いてきたら「続行」で、許可を与えてあげてください。

# キモなど

- 表示バッファを用意して埋めてから一気にシートに書くとか。スピードが段違い
- Project.Dataset.table の関係性