はじめに
Google Apps Script(以下、GAS)をWebアプリケーションとして実行してみたいと思います。
本記事ではその手順を備忘録として残します。初回実行の時にしか表示されない画面とかあるので。
GASのスクリプトは簡単なもので、doPostで送られてきたパラメータを受け取り、それをスプレッドシートに記載する、というものにします。
それでは行ってみましょう。
スクリプトを書いて公開する
とりあえずスクリプトを書いてみます。一応手順にしました。
スプレッドシートを開きます。
メニューバーの「ツール」から「スクリプトエディタ」をクリックします。
「コード.gs」というのが表示されていると思います。ここにスクリプトを記載します。デフォルトで「myFunction()」が書かれています。
本記事ではGASのWebアプリケーションとしての実行をやりたいので、以下のコードを書いてみました。
function doGet(e) {
// doPostから送られてきたパラメータを受け取る。
var param1 = e.parameter.pParam1;
var param2 = e.parameter.pParam2;
var param3 = e.parameter.pParam3;
WriteParamSpreadsheet(param1, param2, param3);
}
function WriteParamSpreadsheet(param1, param2, param3) {
// スプレッドシートのIDを指定して変数に格納。
var InfoSpreadsheet = SpreadsheetApp.openById("1Ha4O**********************************IZPFI");
// スプレッドシートの中のシート名を指定して変数に格納。
var InfoSheet = InfoSpreadsheet.getSheetByName("シート1");
InfoSheet.getRange("A1").setValue(param1);
InfoSheet.getRange("A2").setValue(param2);
InfoSheet.getRange("A3").setValue(param3);
}
※スクリプトの説明は後述します。
スクリプトエディタでコードを保存しようとすると、一番最初はプロジェクト名の決める画面が表示されます。
プロジェクト名は何でもいいので、わかりやすい名前を付けて「OK」をクリックします。
メニューバーの「公開」から「ウェブアプリケーションとして導入…」をクリックします。
[Project version]は一番最初の後悔なので「New」が入っています。
[Execute the app as]はとりあえず「Me(自分のGmailアドレス)」にします。
[Who has access to the app]も特に変更せず「Only myself」にします。
これは初回のみ表示される画面です。
スクリプトを書いているプロジェクトが、あなた(自分)のGoogleのデータにアクセスすることを許可してよいかと聞いてきています。
「許可を確認」をクリックします。
Googleのアカウントを入力する画面が表示されますので、対象のアカウントをクリックします。これも初回時しか表示されません。
「詳細」をクリックします。
「”自分で決めたプロジェクト名”(安全ではないページ)に移動」をクリックします。
「許可」をクリックします。この画面も初回時のみ表示されます。
ちなみに、「Googleドライブのスプレッドシートの表示、編集、作成、削除」と書かれており、スプレッドシートに対する許可を求めてきている理由は、スクリプトのスコープに「https://www.googleapis.com/auth/spreadsheets」が入っているからです。(本記事では詳しくは触れません)
これで無事にスクリプトがWebアプリケーションとして公開されました。スクリプトの実行URLが[Current web app URL]に書かれています。
メニューバーの「公開」⇒「ウェブアプリケーションとして導入…」からいつでも確認できますが、ここでメモっておいてもいいと思います。
「OK」ボタンを押して閉じます。
URLからスクリプトを実行する
さて、先ほどのスクリプトをURLを指定して実行するわけですが、スクリプトの内容として、パラメータを受け取ってスプレッドシートに書き出す、というものでした。
ですので、URLにパラメータを指定してあげる必要があります。
まず、実行URLは下記です。(一部をマスク化しています)
https://script.google.com/macros/s/AKfyc**********************************************MuBex/exec
こいつに、以下のパラメータを3つ渡します。
パラメータ名 | 値 |
pParam1 | パラメータ1だよ |
pParam2 | パラメータ2だよ |
pParam3 | パラメータ3だよ |
実行URLにパラメータを渡す指定の仕方ですが、
“実行URL”?パラメータ名1=値1&パラメータ名2=値2&パラメータ名3=値3
となります。
つまり、今回実行するURLは下記となります。
https://script.google.com/macros/s/AKfyc**********************************************MuBex/exec?pParam1=パラメータ1だよ&pParam2=パラメータ2だよ&pParam3=パラメータ3だよ
これを実行すると、スクリプトに、”パラメータ1だよ”と”パラメータ2だよ”と”パラメータ3だよ”という値が入ってくるわけです。
それでは実行してみましょう。
結果では「エラー」と表示されますが、「スクリプトが完了しましたが、・・・」と記載があるので、スクリプト自体は正常終了しています。ただ戻り値が無いと言っているだけです。
さて、スプレッドシートを見てみましょう。セルA1、A2、A3に、それぞれ渡した”パラメータ1だよ”、”パラメータ2だよ”、”パラメータ3だよ”が記載されています。
これがいわゆる、doPostとdoGetですね。
スクリプトの説明
さて、先ほど実行したスクリプトの説明をしたいと思います。
function doGet(e) {
// doPostから送られてきたパラメータを受け取る。
var param1 = e.parameter.pParam1;
var param2 = e.parameter.pParam2;
var param3 = e.parameter.pParam3;
WriteParamSpreadsheet(param1, param2, param3);
}
function WriteParamSpreadsheet(param1, param2, param3) {
// スプレッドシートのIDを指定して変数に格納。
var InfoSpreadsheet = SpreadsheetApp.openById("1Ha4O**********************************IZPFI");
// スプレッドシートの中のシート名を指定して変数に格納。
var InfoSheet = InfoSpreadsheet.getSheetByName("シート1");
InfoSheet.getRange("A1").setValue(param1);
InfoSheet.getRange("A2").setValue(param2);
InfoSheet.getRange("A3").setValue(param3);
}
1行目のdoGet(e)
⇒doPost(URLを指定して実行)のリクエスト処理を受け取る関数です。
var param1 = e.parameter.pParam1;
var param2 = e.parameter.pParam2;
var param3 = e.parameter.pParam3;
⇒URLで指定した「pParam1」「pParam2」「pParam3」の値を変数(param1,param2,param3)に格納しています。
WriteParamSpreadsheet(param1, param2, param3);
⇒スクリプト後半のWriteParamSpreadsheet()関数に、値を渡しながら呼び出しています。
function WriteParamSpreadsheet(param1, param2, param3)
⇒値を3つ受け取って実行する関数です。最終的にはスプレッドシートに受け取った変数の値を書きだします。
var InfoSpreadsheet = SpreadsheetApp.openById("1Ha4O**********************************IZPFI");
⇒スプレッドシートのIDを指定して、スプレッドシートを変数(InfoSpreadsheet)に格納しています。
※スプレッドシートのIDとは、スプレッドシートのURLの下記の部分です。
var InfoSheet = InfoSpreadsheet.getSheetByName("シート1");
⇒先ほどのスプレッドシートの変数から「getSheetByName」メソッドでシート名を指定し、そのシートを変数(InfoSheet)に格納しています。
InfoSheet.getRange("A1").setValue(param1);
InfoSheet.getRange("A2").setValue(param2);
InfoSheet.getRange("A3").setValue(param3);
⇒先ほど格納したシートの変数から、「getRange」メソッドで書きだすセルを指定し、「setValue」メソッドで値を書きだしています。
補足(スクリプトを更新した時は)
Webアプリケーションとして公開しているスクリプトを修正した時などは、あらためて「ウェブアプリケーションとして導入…」から再度公開し直す必要があります。
公開し直して、版を最新にしないと、修正前のスクリプトが実行されてしまいます。
スクリプトを修正したら、その新しい状態をGoogleに渡す、といったイメージでしょうか。
手順は下です。
- メニューバーの「公開」から「ウェブアプリケーションとして導入…」をクリックします。
- [Project version]のプルダウンから、「New」を選択し、「更新」ボタンをクリックします。
- 「OK」をクリックします。
終わりに
お読みいただきありがとうございました。
ツールにおいては、Googleが強いですね。Google Apps Scriptを極めていけば、G-Suiteを導入している企業に良い改善提案ができそうです。
コメント