0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASによるWeb APIの作り方

Posted at

はじめに

Google Apps Script (GAS) のWebアプリをデプロイする機能を利用すると Web API を作ることができます。

Web API を利用すればスプレッドシートのデータを外部ページから参照・更新するなど、Google Workspaceアプリの利用幅を広げることができます。

Web APIの作り方

シンプルなAPIを作る

まずはJSON文字列を返すだけのシンプルなWeb APIから作ってみましょう。

  1. スクリプトプロジェクトを作成する
    任意のフォルダにWebアプリとして公開するGASのスクリプトプロジェクトを作成します。

    image.png

  2. スクリプトを編集する
    GASでWebアプリを作成するにはGETリクエストに応答する doGet関数 かPOSTリクエストに応答する doPost関数 を定義する必要があります。
    以下はGETリクエストに応じて固定された文字列を返すシンプルなWeb APIの例です。

    function doGet(e) {
      let data = {author: "__SATO__"};
      let json = JSON.stringify(data); // ※1
      let response = ContentService.createTextOutput(json); // ※2
      response.setMimeType(ContentService.MimeType.JSON); // ※3
      return response;
    }
    

    ※1 WebAPIは文字列を返す必要があるのでJSONオブジェクトは文字列化します。
    ※2 Webアプリとして公開できるようTextOutputオブジェクトに変換します。
    ※3 レスポンスデータの種類を指定します。

  3. APIをデプロイする
    スクリプトエディタで「デプロイ」→「新しいデプロイ」と選択し、デプロイの種類を「ウェブアプリ」にしてから「デプロイ」ボタンをクリックしてください。

    image.png
    image.png

  4. 動作を確認する
    デプロイが完了すると下図のようにウェブアプリのURLが表示されるのでブラウザでアクセスしてみましょう。

    image.png

    すると下図のようにJSON文字列が表示されるはずです。

    image.png

GoogleWorkspaceアプリと連動させる

doGet関数 や doPost関数 の中は AppsScriptサーバ環境 なので、GoogleWorkspaceアプリと連携する処理は普段のGASの開発と同じ方法で記述できます。

ここでは試しに自分自身にGmailで通知を出すAPIを作ってみましょう。

  1. スクリプトプロジェクトを作成する
    任意のフォルダにWebアプリとして公開するGASのスクリプトプロジェクトを作成します。

    image.png

  2. スクリプトを編集する
    GETリクエストに応答して固定された内容のメールを送信する doGet関数 を定義します。

    function doGet(e) {
      // Gmailで通知を出す
      let recipient = Session.getActiveUser().getEmail();
      let subject = "GETリクエストを受け付けました"
      let timestamp = Utilities.formatDate(
          new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss"
      );
      let body = `${timestamp}にGETリクエストを処理しました`;
      GmailApp.sendEmail(recipient, subject, body);
    
      // レスポンスを返す
      let response = ContentService.createTextOutput(body);
      response.setMimeType(ContentService.MimeType.TEXT);
      return response;
    }
    

  3. APIをデプロイする
    スクリプトエディタで「デプロイ」→「新しいデプロイ」と選択し、デプロイの種類を「ウェブアプリ」にしてから「デプロイ」ボタンをクリックしてください。

    image.png
    image.png

  4. 動作を確認する
    デプロイが完了すると下図のようにウェブアプリのURLが表示されるのでブラウザでアクセスしてみましょう。

    image.png

    すると下図のようにブラウザに文字列が表示され、Gmailに通知が届いているはずです。

    image.png

パラメータを受け取る

ここまではHTTPリクエストに対して固定的された応答を返していましたが、実際のAPIはユーザ入力に応じて動作が異なる場合の方が多いと思います。

そこで、ここからはユーザ入力を受け取って処理する方法を少し紹介していきます。

パスパラメータの処理

GASで作成したWebアプリのULRは基本 "exec" (※テストの場合は"dev") で終わりますが、GASのWebアプリはその後に "/hoge/huga" のようなパスを追加することもでき、"exec"ないし"dev"以降のパスパラメータは doGet関数や doPost関数 の引数として与えられるイベントオブジェクトの pathInfoプロパティ を参照することで取得できます。

以下はGETリクエストのパスパラメータに応じて挨拶を返すAPIのサンプルです。

function doGet(e) {
  let pathInfo = new String(e.pathInfo); // "greeting/morning"などの形式
  let pathList = pathInfo.split('/'); // ["greeting", "morning"]に変換
  let response = null;
  if (pathList[0] == 'greeting' && pathList[1] == 'morning') {
    response = ContentService.createTextOutput('おはようございます!');
  } else if (pathList[0] == 'greeting' && pathList[1] == 'afternoon') {
    response = ContentService.createTextOutput('こんにちは!');
  } else if (pathList[0] == 'greeting' && pathList[1] == 'evening') {
    response = ContentService.createTextOutput('こんばんは!');
  } else {
    response = ContentService.createTextOutput('ハロー!');
  }
  response.setMimeType(ContentService.MimeType.TEXT);
  return response;
}

上記のAPIがデプロイできたら、デプロイURLの末尾にパスパラメータを付けることで次のような動作を確認できるはずです。

パラメータの処理(GET編)

GASでGETリクエストのクエリパラメータを受け取るには doGet関数 の引数として与えられるイベントオブジェクトのparameterプロパティを参照します。

以下はGETリクエストのクエリパラメータを文字列に埋め込んで表示するAPIのサンプルです。

function doGet(e) {
  let name = e.parameter.name;
  let age = e.parameter.age;
  let response =  ContentService.createTextOutput(
    `パラメータ: name = ${name}, age = ${age}`
  );
  response.setMimeType(ContentService.MimeType.TEXT);
  return response;
}

上記のAPIがデプロイできたら、デプロイURLの末尾にクエリパラメータを付けることで次のような動作を確認できるはずです。

パラメータの処理(POST編)

GASでPOSTリクエストのリクエストボディパラメータを受け取るには doPost関数 の引数として与えられるイベントオブジェクトのpostDataプロパティを参照します。

以下はPOSTリクエストのリクエストボディパラメータを文字列に埋め込んで表示するAPIのサンプルです。

function doPost(e) {
  let postData = JSON.parse(e.postData.contents);
  let name = postData.name;
  let age = postData.age;
  let response = ContentService.createTextOutput(
    JSON.stringify({"user input": `name=${name}, age=${age}`})
  );
  response.setMimeType(ContentService.MimeType.JSON);
  return response;
}

doPost関数が保存出来たら以下の設定でAPIをデプロイしてください。

  • デプロイの種類:ウェブアプリ
  • 次のユーザーとして実行:自分
  • アクセスできるユーザー:全員

スクリーンショット 2024-11-22 234902.png

デプロイが完了したら、次のようなcurlコマンドでAPIの動作を確認しましょう。

curl -L -H "Content-Type: application/json" -d '{"name":"SATO","age":"33"}' https://script.google.com/(中略)/exec

image.png

doPostの利用について

doPost関数には認証の仕組みがないため、URLエントリポイントさえ知っていれば誰でも実行できてき舞います。 これは安全な状態ではないので、APIの設計・運用については十分に注意してください。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?