oinume journal

Scratchpad of what I learned

Google Apps Scriptで外部のREST APIを呼び出す

Google Apps Script(GAS)から外部のREST APIを呼ぶには、UrlFetchApp.fetch というメソッドを呼び出せば良い。例えばJSONをリクエストのペイロードとして送る場合のサンプルコードはこんな感じ。

  var data = {
    'email': email,
    'subject': subject,
    'message': message,
  };
  var credential = PropertiesService.getScriptProperties().getProperty('FRESHDESK_CREDENTIAL');
  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      'Authorization': 'Bearer ' + Utilities.base64Encode(String(credential))
    },
    'payload': JSON.stringify(data)
  };
  
  var response = UrlFetchApp.fetch('<api endpoint>', options);

fetchの第2引数に渡すoptions に以下のフィールドをセットしている。

  • method: HTTP method
  • contentType: application/json を指定
  • headers.Authorization でAPIのトークンを指定
    • ベーシック認証もできる
  • payload: リクエストのペイロードをJSONにしておく

また、上のコードのAPIのキーである credential はスクリプトのプロパティから値を取得している。ログインIDやパスワードなどをスクリプトの中に埋め込みたくない場合は環境変数みたいな感じで使えるスクリプトのプロパティを使うのが良いみたい(ソース)。

ハマったポイントとして、外部のAPIを呼び出す場合は、scopeに https://www.googleapis.com/auth/script.external_request がないと権限がないというエラーになるので注意。ファイル→プロジェクトのプロパティ→スコープ のタブで確認できる。スクリプトに対するスコープを再設定したい場合は、GUIだとプロジェクトを作り直してコードをコピペするしかなさそうな雰囲気。

自分は、Googleフォームで受けた問い合わせをFreshDeskというSaaSのシステムにAPIで投げて問い合わせを管理するということがやりたかったので、頑張ってスクリプトを書いた。これでGoogleフォームのインタフェースを使いつつ、バックエンドはちゃんとしたシステムで問い合わせを管理するということができるようになりましたとさ。

仕事で使える!Google Apps Script (仕事で使える!シリーズ(NextPublishing))

仕事で使える!Google Apps Script (仕事で使える!シリーズ(NextPublishing))