Google Apps Scriptを利用してGoogleスプレッドシートのデータをS3へJSONとして保存する

こんにちは。サービスグループの武田です。

これまで、Googleスプレッドシートで管理しているデータをJSONに加工し、S3にアップロードするという作業をPythonおよびAWS CLIで行っていました。今回、運用の簡略化などを目的としてGoogle Apps Script(GAS)として実装してみました。

始めに

JSONではなくCSVとして保存するエントリは菅野が書いています。

GoogleスプレッドシートのデータをS3へCSVとして保存する

今回のエントリもスクリプトを作成するまでの手順は同一となります。

  • スプレッドシートおよびデータの用意
  • S3バケットおよびフォルダの作成
  • IAMポリシーとユーザー作成
  • アクセスキーの取得

試してみようという方は、上記エントリを参考にセットアップを進めてください。

スクリプトファイルの作成

準備ができたらツール > スクリプト エディタと選択してスクリプトエディタを起動します。

プロジェクト名を指定し、次のコードを保存します。ついでにファイル名もgss2s3.gsに変更してみました。

// use library: MB4837UymyETXyn8cv3fNXZc9ncYTrHL9

function uploadS3() {
  var props = PropertiesService.getScriptProperties();
  var accessKey = props.getProperty('AWS_ACCESS_KEY_ID');
  var secretKey = props.getProperty('AWS_SECRET_ACCESS_KEY');
  var bucketName = props.getProperty('BUCKET_NAME');
  var filePath = props.getProperty('FILE_PATH');
  var spreadsheetId = props.getProperty('SPREADSHEET_ID');
  var sheetName = props.getProperty('SHEET_NAME');

  var sheetData = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName).getDataRange().getValues();
  var header = sheetData[0];
  var body = sheetData.slice(1);

  var data = toJson(header, body);

  var s3 = S3.getInstance(accessKey, secretKey);
  var blob = Utilities.newBlob(data, 'application/json');
  var response  = s3.putObject(bucketName, filePath, blob, {logRequests: true});
  Logger.log(response);
}

/**
 * bodyのデータを、対応するheaderの値をキーとしたJSONデータに加工し、そのJSON文字列を返す。
 */
function toJson(header, body) {
  var json = body.map(function(row) {
    return row.reduce(function(accum, v, i) {
      accum[header[i]] = v;
      return accum;
    }, {});
  });
  return JSON.stringify(json);
}

ライブラリの追加

GASからS3にアップロードするため、リソース > ライブラリメニューからS3-for-Google-Apps-Scriptというライブラリを追加します。

MB4837UymyETXyn8cv3fNXZc9ncYTrHL9を追加して、バージョンは4を指定します。

スクリプトのプロパティを設定

最後にスクリプトのプロパティを設定します。今回は、AWSのアクセスキーやS3のバケット名などはハードコードせず外部のパラメータとして設定するようにしてみました。

  • AWS_ACCESS_KEY_ID
    • 取得したアクセスキー
  • AWS_SECRET_ACCESS_KEY
    • 取得したシークレットキー
  • BUCKET_NAME
    • 作成したバケット名
  • FILE_PATH
    • バケット内の保存するパス
    • test-data/price-list.json
  • SPREADSHEET_ID
    • データを管理しているスプレッドシートのID
  • SHEET_NAME
    • データを保持しているシート名
    • price-list

まずはファイル > プロジェクトのプロパティを開きます。

次にスクリプトのプロパティタブを選択し、自分の環境に合わせて各パラメータを設定します。

実行してみる

実行する関数名が選択されていることを確認し、実行ボタンをクリックしましょう。

次のような確認が最初だけ表示されます。許可しましょう。

マネジメントコンソールからアップロードされたファイルを確認すると、次のようなJSONファイルがアップロードされていました!

中身を開いてみると、スプレッドシートのデータがJSONとなっています。

ログについて

プログラム内でLogger.log(response);という行がありました。多くのJavaScriptの実行環境ではconsole.log()を使用しますが、GASではLogger.log()を使用します。出力されたログは表示 > ログから確認できます。

デバッグや実行結果の確認に活用してみてください。

まとめ

JSON形式のデータはプログラムから使いやすいデータ形式のひとつです(個人の見解です)。ただ人の手でJSONを管理するのはつらいですよね。スプレッドシートでデータを管理しJSONに加工することで、管理のしやすさと使いやすさが両立できます。

また作成した関数はスプレッドシートのマクロとしてインポートすることで、ワンクリックで簡単に実行できます。とても便利ですね!