【GAS】Google Apps Scriptでコードをバックアップ・遠隔更新する

GASで様々なアプリを開発してると同じようなコードや、同じプロジェクトを複数デプロイして運用するケースがあります。それらを現在運用中のプロジェクトに対して更新した内容を反映するには、通常コードをコピペし直すであったり、ライブラリであるならばライブラリのバージョンを更新するといった作業を行う必要があります。

それだけでなく現在のコードをバックアップ・復元するといった事が必要なケースでもまとめて出力しておきたい所。そうした手法に関して今回まとめてみました。尚、Githubに対してのPush/Pullでのバックアップ・復元は便利な以下のような拡張機能があるため、そちらを利用すると捗るでしょう。

Google Apps ScriptのコードをGitHubで管理する拡張機能【GAS】

今回利用するスプレッドシート等

事前準備

概要

今回のエントリーでは、Advanced ServiceのDrive APIを利用するケースや、GCP側で利用するGoogle Apps Script APIを利用するケースが存在する為、以降の設定やコードについてはコードを更新したい側のスクリプトに実装する必要があります。また一連のコードを更新するコード自体はライブラリ化しておいて、各プロジェクトから参照するようにしておくと管理の手間が削減可能になります。

Drive APIを有効化する

スクリプトエディタに入って、以下の作業が必要になります。

  1. スクリプトエディタを開く
  2. エディタの左側、サービスの横の+をクリックする
  3. Drive APIを探して選択し、追加をクリック

これで、Drive APIの各種メソッドが利用する事ができるようになります。V2とV3があるので要注意(デフォルトがV3となってるので、V2の記法で書きたい場合は、V2に任意に変更して追加が必要です。

図:Drive APIを追加する

Google Apps Script APIをオンにする

Google Apps Script自体を管理や更新する為に、以下の作業をしておく必要があります。

  1. こちらのリンクをクリックして開く
  2. Google Apps Script APIをクリックする
  3. チェックがあるのでオンにする

この作業はそのプロジェクトをデプロイするアカウント毎に行う必要があります。

※このAPIは過去にExecution APIと呼ばれていたもので、現在はGASのメソッドを外部から実行するだけじゃなく、GASプロジェクト自体を操作するものに進化しています。

Google Apps Scriptを色々なアプリから実行する【GAS】

図:APIを有効化する

GCP側とリンクする

この作業は、前述のGoogle Apps Script APIを利用する場合に必要な作業です。GCP側のプロジェクトとGASのプロジェクトをリンクさせる必要性があり、またGCP側でもAPIを有効化する必要があるので、連結しておきましょう。

連結する手順は以下の通り

  1. Google Cloud Consoleを開く
  2. 左上にある▼をクリックする
  3. ダイアログが出てくるので、新規プロジェクトを作るか?既存のプロジェクトを選択する。この時、Google Workspaceであれば選択元は「自分のドメイン」を選択する必要があります。
  4. プロジェクト情報パネルから「プロジェクト番号」をコピーする
  5. 対象のGoogle Apps Scriptのスクリプトエディタを開く
  6. サイドバーからプロジェクト設定を開く
  7. プロジェクトを変更ボタンをクリック
  8. GCPのプロジェクト番号に、4.の番号を入れてプロジェクトを設定をクリック

図:プロジェクト番号をコピーしておきます

図:プロジェクト変更画面

GCP側でAPIを有効化する

また、GCP側でもGoogle Apps Script APIを有効化する必要があり、またこの場合Drive APIも有効化する必要があるので、以下の手順でGCP側のAPIを有効化しておきましょう。

  1. GCPのプロジェクトを開く
  2. 左サイドバーからAPIとサービスを開く
  3. 上部にある「APIとサービスを有効化する」をクリックする
  4. 検索窓から「apps script」で検索すると一発でヒットするのでクリックする
  5. 有効化をクリックする
  6. 同じくDrive APIについても検索して有効化しておきます

図:GCP側でも有効化が必要です

ライブラリを導入する

GASのコードのバックアップや復元、またマニフェストの内容を更新する場合、Google Apps Script APIを利用してREST APIを叩いて操作する必要があります。また、その際に以下の2つのスコープが必要になるのですが、更新したい側のappsscript.jsonに入れてしまうと他のスコープも全部手動でいれる必要性が出てしまうのでちょっと不便です。リファレンスはこちらにあります。

  • https://www.googleapis.com/auth/script.external_request
  • https://www.googleapis.com/auth/script.projects

ということで、この作業を簡単に行えるライブラリが公開されているので、このライブラリを追加しておきます。

  1. こちらのサイトに掲示されてるライブラリのスクリプトIDを取得する
  2. スクリプトエディタのライブラリの横にある+をクリックする
  3. 1.のスクリプトIDを追加して検索をクリック。
  4. 追加をクリックする
  5. 一回、適当な関数を作って実行し承認を実行する
  6. アカウントを選択して認証画面が出るので許可をクリックする

図:ライブラリを追加する

図:認証を許可する

更新対象のプロジェクトのスクリプトIDを取得する

今回導入したライブラリでは、操作したい対象のGASプロジェクトのスクリプトIDが必要になります。手動で調べる場合は

  1. スクリプトエディタを開く
  2. 左サイドバーからプロジェクトの設定を開く
  3. IDの項目にスクリプトIDがあるのでこれをコピーしておく

また、コードから自動で取得する場合には、以下のコードでスクリプトIDは簡単に取得する事が可能です。

このスクリプトIDを元にProjectApp2でプロジェクトの詳細情報を取得する場合は以下のようなコードを実行します。

すると、そのプロジェクトの詳細情報を取得する事が可能になります。これがプロジェクト操作の基本になります。

ソースコード

コードのバックアップ

コードのバックアップは簡単に行えますが、ProjectApp2.getProjectBlobで取得する際に、第二引数がtrueの場合はファイル類はZIPでパッケージされた状態で返ってきます。falseの場合は各ファイルが個別に返ってきますが、いずれもBlobデータが配列で返ってくるので、trueを指定した場合は1個のみ故に、blob[0]として取得してDriveApp.createfileでファイルを生成することが可能です。

ZIPの中身はHTMLやgsファイル、appsscript.jsonといったファイル類が格納されているので、さらに取り出して加工する場合にはZIPのメソッドを使って解凍すると良いでしょう。

Google Apps ScriptでZIP圧縮・解凍をやってみる【GAS】

図:ZIPの中身を見てみた

コードを復元する

Google Apps Scriptのgsファイルを更新したり、HTMLファイルを更新する事が可能です。後述のマニフェストファイルを更新することで、ライブラリのバージョンを変更したりも可能ですが、新しいAPI等をgsに含めてる場合には、再認証が必要となるので要注意です。

また、ProjectApp2ではウェブアプリケーションの再デプロイが装備されていないので、ウェブアプリケーションを更新する場合には、手動で再デプロイを行うか?自身でREST APIを使って更新を装備するか?後述のドライブ上のファイルを読み取って表示するように変更するか?といった策を講じる必要性があります。

ファイルは複数同時に行う事ができますが、ファイル名をきちんと指定する必要があります。blobに配列で複数のblobを指定することで同時に更新してGASのコードを置き換えることが可能です。

ファイル名はどんなファイル名でも良いのですが、setNameで指定した名称のファイルを更新することになるので、明示的にスクリプトエディタ内の対象のファイル名をここで指定しないと、同じファイル名の内容が別々にアップされてしまい上書きされないので要注意(逆に言えば新しいgsファイルを追加することが可能です)。

また、プロジェクト履歴に更新履歴は残らないので、この点に関しても注意が必要です。ファイルの削除などはできないようです。

その他の手法

ライブラリを利用する

ライブラリ利用の基本

GAS内で利用してる便利な処理や関数などについては、特別な手法を使うのではなくライブラリを利用してコードを切り出しておき、運用してるプロジェクト側からは大半のコードをライブラリ内のものを利用する形で構築することで、ライブラリのバージョンを変更するだけで、処理内容を更新する事が可能です。

但し、通常ライブラリのバージョンの変更については各プロジェクトに入って手動でライブラリバージョンを更新する必要がある為、手動での作業が必要になっています。このライブラリに関する情報はappsscript.jsonというマニフェストファイルに記述されています。

※但し、更新したライブラリ側に新しいAPIなどが追加されていた場合には再度認証が必要になってしまうので、認証作業も必要になります(でなければ動作しません)

Google Apps Scriptはライブラリを活用すべし【GAS】

マニフェストをGASから更新する

ライブラリのバージョンはマニフェストに記述されているので、マニフェストの対象のライブラリのバージョンを変更することで、参照するライブラリバージョンを書き換える事が可能です。スタンドアロンスクリプトの場合はこちらのライブラリを使って更新可能ですが、スプレッドシート等に連結されてるコンテナバインドスクリプトは更新できない為、ProjectApp2を使って更新を行います。

以下のコードはtestmanというライブラリがVersion2で追加されているのですが、このバージョンを3にアップデートします。

実際に実行した後にスクリプトエディタのページをリロードしてみると、testmanというライブラリのバージョンが3にアップデートされていました。このスクリプトを使えばライブラリのバージョンを自動更新可能ですので

  1. ライブラリの最新バージョン番号をGoogle Driveで公開してるJSONファイルに記述する
  2. 1.のバージョン番号を取得したら、上記のプログラム内でtestmanのversionの値に代入する
  3. スクリプトトリガーを使って深夜の0時などに定期的に実行する

1.のバージョン情報ファイルのJSONファイルもしくは、上記のコードのjson部分全部をJSONファイルとして社内もしくは一般公開しておけば、更新が走った際に参照されて、取り込まれる仕組みです。oauthScopesやAdvanced Serviceの追加なども一括でコードで変更ができるので非常に便利な手法です。

※但し、前述にもあるようにライブラリの新バージョンにこれまで使っていなかったようなAPIがある場合、最初の実行時に再認証が走ることになるので、なるべく新しいAPIを入れないようにする初期の設計が重要になります(でなければ更新後に手動で認証をファイル毎に行う必要があります)。

図:ライブラリのバージョンが自動更新された

ウェブアプリ側のみを更新する

WebアプリケーションであるHTMLについても、ProjectApp2を利用して入れ替えることは可能なのですが、GAS側のコードに変更がなくHTML側だけしか変更しないといったようなシンプルなWebアプリケーションの場合は、HTMLのみをファイル化しておいて都度ロードして表示することで追加デプロイをすることなく、Webアプリケーションを更新することが可能です。

ドライブにHTMLファイルをアップロードしておき、そのファイルIDをDriveAppで取得し、HtmlService.createHtmlOutputで表示する。一度手動でデプロイしておく必要があります。ファイルを上書きするだけでウェブアプリケーションが入れ替わるので、再デプロイが必要ないという利点があります。

ProjectApp2では再デプロイを指定できないので、この手法を使ってHTMLを更新する手法は有益ではないかと思います。もちろん、ライブラリにHTMLを含めて参照して取得するのも有用な手法だと思います。

※こちらのREST APIを実装できれば、デプロイメントも更新が可能です。こちらに関しては以下のエントリーの「デプロイを自動化する」に記述していますので、ウェブアプリケーションのデプロイも自動化したい場合は利用してみてください。

Google Apps Scriptでウェブアプリケーション作成入門【GAS】

 

図:HTMLファイルを入れ替えるだけで更新される

JSファイルを読み込ませて実行させる

PDFフォームの操作でも紹介した手法ですが、Google Drive上に存在するJSファイルを読み込ませて、中に入ってるメソッドや関数などを実行させることが可能です。eval関数にてDriveAppを使ってテキストデータを読み込ませると、ただのテキストではなくコードとして読み込ませる事が可能であるため、複雑なロジックを利用することなく、主要なコードを読み込ませることができるうえに、ライブラリのようにバージョン更新も不要なので色々と便利です。

尚、テストで用意したJSファイルの中身は以下のようなものを入れています。Google Apps Scriptのメソッドでも呼び出すことが可能です。

Google Apps ScriptでPDFフォームを操作する【GAS】

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)