Google Apps Scriptでは、作成したコードをウェブアプリケーションとして公開することができます。
具体的な手順については、タカハシ(@ntakahashi0505)さんがブログでまとめられているので、そちらが参考になるかと思います。
公開したウェブアプリケーションは下記サイトのようにWeb APIのように使えるわけですが、アクセス可能なユーザーを指定していると認証が必要になり、curl等で直接叩くことができなくなります。
今回はリクエストヘッダーに認証情報を追加して、GASのウェブアプリケーションを外部から実行する方法を紹介します。
アクセスできるユーザーを指定しない場合の動作確認
まずは、ウェブアプリケーションにアクセス可能なユーザーを指定しない場合の動作を確認してみます。
- POSTした値を返すだけの簡単なコードを貼り付け、プロジェクトを保存します。
- 「公開」メニューから「ウェブ アプリケーションとして導入」をクリックします。
- 「アプリケーションにアクセスできるユーザー」を「全員(匿名ユーザーを含む)」として、「導入」ボタンをクリックします。下記画像はテスト環境の都合上、UIが一部英語になっています。
- 「ウェブ アプリケーションとして導入」画面上にアプリのURLが表示されるので、コピーしておきます。
- 手順4.でコピーしたURLに対してcurlコマンドでPOSTすると、意図した通りにPOSTした値が返ってくることが確認できます。URLさえ分かっていれば誰でもアクセスできる設定なので、当たり前と言えば当たり前の挙動です。
function doPost(e) { return ContentService.createTextOutput(e.postData.contents); }
curl -L -d "Hello world." "https://script.google.com/macros/s/***/exec"
アクセスできるユーザーを指定した場合の動作確認
次は、ウェブアプリケーションにアクセス可能なユーザーを指定した場合の動作を確認してみます。
- 「公開」メニューから「ウェブ アプリケーションとして導入」をクリックします。
- 「アプリケーションにアクセスできるユーザー」を「全ユーザー」として、「更新」ボタンをクリックします。
- 再びcurlでPOSTしてみると、POSTした値ではなくHTMLが返ってきます。一部文字化けしているので分かりづらいですが、どうやら認証画面が返ってきているようです。
curl -L -d "Hello world." "https://script.google.com/macros/s/***/exec"
アクセストークンを指定してリクエストを送信
認証が必要な場合、どのようにリクエストを送信すれば良いか?
結論から言ってしまうと、“Authorization: Bearer ヘッダーにアクセストークンを含めれば良い”わけです。
アクセストークンの取得
アクセストークンは、ScriptApp.getOAuthToken()メソッドで取得できます。
- 下記コードを貼り付け、「myFunction」を実行します。一行目のコードは、Drive APIを使用するためのスコープの追加用に入れているコードです。
- 画面の指示に従って、リクエストを許可します。
- 処理完了後にログを見ると、ウェブアプリケーションにアクセスするためのアクセストークンが表示されているので、コピーしておきます。
function myFunction() { Logger.log(DriveApp.getRootFolder().getName()); Logger.log(ScriptApp.getOAuthToken()); }
認証が必要な場合のリクエスト送信
アクセストークンが取得できたので、Authorization: Bearer ヘッダーを含めてリクエストを送信してみます。
curl -L -d "Hello world." -H "Authorization: Bearer *** access token ***" "https://script.google.com/macros/s/***/exec"
今度は意図した通りにPOSTした値が返ってきました。
参考Webサイト
Google Apps Scriptのウェブアプリケーションについては、棚池氏がまとめられている下記サイトが非常に参考になりました。この場を借りて、御礼申し上げます。
この記事へのコメントはありません。