Open8

Google Apps Script 開発の知見がたまってきたのでスクラップを書く

manimotomanimoto

開発環境と本番環境を分ける

  • Google Apps Script というと Web エディタに直接書き込みなので本番環境を直接さわることになりがち
  • clasp を使うとデプロイ先を分けることで開発環境と本番環境を分けることが可能
  • ただ clasp をそのまま使うと、 clasp push.clasp.json に書かれた環境にデプロイされるだけで環境を分けられない

環境を分けてデプロイする方法

npm スクリプトを使う
(Makefile が好きな人は Makefile でもよいかと)

  1. プロジェクトルートに以下のファイルを配置
    • .clasp.dev.json : scriptId に開発環境のスクリプトIDが設定されたファイル
    • .clasp.prod.json : scriptId に本番環境のスクリプトIDが設定されたファイル
  2. package.json の scripts フィールドに以下を記述
"scripts": {
    "link:dev": "ln -s .clasp.dev.json .clasp.json",
    "link:prod": "ln -s .clasp.prod.json .clasp.json",
    "push:dev": "npm run link:dev && clasp push",
    "push:prod": "npm run link:prod && clasp push"
},
  1. 以下コマンドで開発環境・本番環境にデプロイできる
    • npm run push:dev : 開発環境
    • npm run push:prod : 本番環境
manimotomanimoto

スクリプトプロパティの設定をコードで行う

背景:スクリプトプロパティの設定が不便になった

  • Google Apps Script の新エディタではスクリプトプロパティの設定の動線がなくなった
  • 旧エディタでもスクリプトプロパティの編集・追加ができなくなることがある

対応策:コードでスクリプトプロパティを設定する

  • 以下をコード上に書いておき、必要に応じて利用するのがよい
  • value に改行を含めたい場合は \n を入れてやる
PropertiesService.getScriptProperties().setProperty("<key>", "<value>");
manimotomanimoto

Container-bound Scripts で作る。 Standalone Scripts は作らない

  • Google Apps Script には以下2種類がある
    • Container-bound Scripts : Google スプレッドシートなどに紐づくスクリプト
    • Standalone Scripts : 独立したスクリプト
  • Google スプレッドシートを使わないのであれば Standalone Scripts はアリに思える
  • しかし、 Standalone Scripts 作成後に以下のような要望がでる可能性がある
    • 実行結果を表で出力したい
    • 非エンジニアが設定値を設定できるようにしたい
    • 実行ログを残したい
  • こういった場合に Standalone Scripts だと Container-bound Scripts への移植が必要になり後々面倒
  • 当初は全く Google スプレッドシートを使用しない場合でも、最初から Google スプレッドシートの Container-bound Scripts で作っておいたほうがよい
manimotomanimoto

TypeScript で書く

manimotomanimoto

Tamotsu を使う

manimotomanimoto

Utilities Class を活用する

おすすめメソッド

sleep(milliseconds)

  • 指定ミリ秒 sleep するメソッド
  • setTimeout, while, for などを駆使して sleep 処理を書く必要がなくなる
Utilities.sleep(10000); // 10秒 sleep

formatDate(date, timeZone, format)

  • Dateオブジェクトを指定した日時フォーマットの文字列に変換するメソッド
const date : Date = new Date(2022, 1, 8, 0, 0, 0);
const strDate : string = Utilities.formatDate(date, "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss");
console.log(strDate); // 2022/02/08 00:00:00

getUuid()

  • UUID を採番してくれるメソッド
console.log(Utilities.getUuid()); // 2e8e6ecc-cfd0-4e9d-9e6c-aff8c9091194