LoginSignup
107
98
記事投稿キャンペーン 「AI、機械学習」

Google Apps ScriptでGPTsのCustom ActionsのAPIを作ってみた

Last updated at Posted at 2023-11-13

はじめに

GPTsのCustom Actions(カスタムアクション)をつかって、外部のAPIを呼び出して、データを取得することができるようになりました。

たとえば、郵便番号検索APIを呼び出して、ユーザーから入力された住所から、郵便番号を回答するGPTを作ることができます。

詳細についてはこちら

この記事では、Custom Actionsから呼び出されるAPIを、Google Apps Scriptを使って無料で作る方法について説明します。

この記事はこちらのYouTube動画でご紹介いただいております。

この記事の対象者

  • GPTsのCustom ActionsのAPIを自作したい方
  • Google Apps Scriptで簡単なスクリプトを作ったことがある方
  • Zapierの連携よりも複雑な処理を求めている方

APIの概要

シーケンス図で表現しました。

スクリーンショット 2023-11-13 11.08.26.png

"Google Apps Script"にあたるところが、今回作成するAPIになります。
処理としては4桁の数字をキーとして、Googleスプレッドシートからその数字に対応する苗字と名前を探します。
あと、いくつかのエラー処理も入ってます。

ちなみに、上から2番目と3番目の処理

  • 質問文から4桁の数字を取り出す
  • 4桁の数字のデータを渡す

がCustom Actionsにあたります。

Googleスプレッドシートを作成

こちらが今回のサンプルのGoogleスプレッドシートです。
番号と苗字・氏名はChatGPTにサンプルデータを生成してもらいました。
スクリーンショット 2023-11-13 7.05.12.png

作成したGoogleスプレッドシートの
スプレッドシートIDをテキストエディタなどにコピペしてひかえます。
→次の手順で使用します。

スクリーンショット 2023-11-14 12.17.04.png

この記事のサンプルのGoogleスプレッドシートをシェアしました。
よろしければ、ご自身のGoogleドライブにコピーしてお使いください。
共有リンクはこちら

Google Apps Scriptを作成

スプレッドシートの拡張機能>Apps Scriptを選択します。
スクリーンショット 2023-11-13 9.13.20.png

Apps Scriptのエディタが開きます。
スクリーンショット 2023-11-13 9.17.46.png

こちらのコードを貼り付けます。
// スプレッドシートの準備 の SpreadsheetApp.openById の箇所に
先ほどコピーしてひかえたスプレッドシートIDを貼り付けます。

コード.gs
function doGet(e) {
  // リクエストからパラメータを取得
  console.log("start GPTs Custom Actions API test");
  console.log("e: " + JSON.stringify(e));
  var searchQuery = e.parameter.id;
  console.log("e.parameter.id: " + e.parameter.id);

  // 4桁の数字かどうかをチェック
  if (!searchQuery || !/^\d{4}$/.test(searchQuery)) {
    console.log("bad format: " + searchQuery);
    return ContentService.createTextOutput(
      JSON.stringify({ "error": "Invalid request. Please provide a 4-digit number." })
    ).setMimeType(ContentService.MimeType.JSON);
  }

  // スプレッドシートの準備
  var sheet = SpreadsheetApp.openById('ここにスプレッドシートIDを貼り付ける').getSheetByName('シート1');
  var data = sheet.getDataRange().getValues();
  console.log("format OK");

  // スプレッドシートを検索
  for (var i = 1; i < data.length; i++) {  // 2行目から開始
    if (data[i][0].toString() === searchQuery) {
      console.log("hit: " + i);
      console.log("last: " + data[i][1]);
      console.log("first: " + data[i][2]);
      // 見つかった場合、JSONとして返す
      return ContentService.createTextOutput(
        JSON.stringify({ "lastname": data[i][1], "firstname": data[i][2] })
      ).setMimeType(ContentService.MimeType.JSON);
    }
  }
  console.log("not found");
  // 一致するデータが見つからない場合
  return ContentService.createTextOutput(
    JSON.stringify({ "error": "No data found for the provided number." })
  ).setMimeType(ContentService.MimeType.JSON);
}

コードの処理内容は以下の通りです。

  • リクエストからパラメータの取得: リクエストからidという名前のパラメータを取得し、searchQuery変数に格納します。

  • パラメータの形式チェック: 取得したsearchQueryが4桁の数字であるかどうかをチェックします。この形式に合致しない場合、エラーメッセージを含むJSONレスポンスを返し、処理を終了します。

  • スプレッドシートの準備: 特定のスプレッドシートを開き、'シート1'という名前のシートからデータを取得します。

  • スプレッドシート内の検索: スプレッドシートのデータをループ処理し、各行の最初のセルの値がsearchQueryと一致するかを確認します。ループは2行目から始まります。

  • データが見つかった場合の処理: 一致するデータが見つかると、その行の2番目と3番目のセルの値を姓(lastname)と名(firstname)としてJSON形式でレスポンスとして返します。

  • データが見つからなかった場合の処理: スプレッドシート内で一致するデータが見つからない場合、「提供された番号に対するデータが見つからない」(英文)というエラーメッセージを含むJSONレスポンスを返します。

Google Apps Scriptをデプロイ

スクリーンショット 2023-11-13 9.22.42.png
スクリーンショット 2023-11-13 7.01.06.png
スクリーンショット 2023-11-13 7.01.18.png
スクリーンショット 2023-11-13 7.02.02.png
スクリーンショット 2023-11-13 7.02.14.png
スクリーンショット 2023-11-13 7.02.29.png
スクリーンショット 2023-11-13 7.02.45.png
スクリーンショット 2023-11-13 7.02.54.png
デプロイが完了するとこちらの画面になります。
ウェブアプリの コピー をクリックして、URLをコピーしてテキストエディタなどにコピペしておきます。
→次の手順で使用します。
スクリーンショット 2023-11-13 7.03.13.png

GPTsを作成

スクリーンショット 2023-11-13 9.58.59.png
Upload files は無し。
Capabilities も何も設定しません。
一番下の
Use conversation data in your GPT to improve our models
のチェックボックスもOFFにします。
スクリーンショット 2023-11-13 7.13.14.png

GPTsのCustom Actionsを設定

前の項目のスクショで説明した歯車のアイコンをクリックしてCustom Actionsの設定画面を開きます。
スクリーンショット 2023-11-13 9.59.29.png

Schemaは以下のコードをコピペします。
コピペしたら、前の章でコピーしておいたデプロイしたURLの一部(/macros以下)を、貼り付けます。
上のスクショで赤文字で説明している箇所に貼り付けます。

例えばデプロイしたURLが

https://script.google.com/macros/s/AKfycbzR2GGFg_9Ilnv55jzZDBQ3J_miH_OIQUn3qDJpPDBWSlnw-OT6H6rRZhkJ57EIijUYEQ/exec

の場合

/macros/s/AKfycbzR2GGFg_9Ilnv55jzZDBQ3J_miH_OIQUn3qDJpPDBWSlnw-OT6H6rRZhkJ57EIijUYEQ/exec

の部分を貼り付けます。

Schema
{
  "openapi": "3.1.0",
  "info": {
    "title": "Get name data",
    "description": "Get lastname and firstname by id",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://script.google.com"
    }
  ],
  "paths": {
    "ここにデプロイしたURLの /macros以下 のアドレスを設定": {
      "get": {
        "description": "Get lastname and firstname by id",
        "operationId": "GetNameByid",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "ID No.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {
      "NameResponse": {
        "type": "object",
        "properties": {
          "lastname": {
            "type": "string"
          },
          "firstname": {
            "type": "string"
          }
        }
      }
    }
  }
}

ためしてみる

よろしければ、こちらからお試しください。

スクリーンショット 2023-11-13 9.25.59.png
Custom Actionを実行していいか聞いてきますので、
Allow か Always allow をクリックします。
→Always allow をクリックすれば、再度聞いてきません。
スクリーンショット 2023-11-13 7.04.28.png
Custom Actionが実行され、1010の番号に対応する苗字「黒田」の回答を得ました。
スクリーンショット 2023-11-13 9.26.36.png
スクリーンショット 2023-11-13 7.05.12.png

Custom Actionでは番号 1010 が送られていることがわかります。
スクリーンショット 2023-11-13 9.26.51.png

Custom ActionsがあるGPTsの公開について

Custom Actions の Privacy Policy(プライバシーポリシー)が空白だと、Only people with a link や Public で第三者に公開できないです。
→Only me で自分だけ使用するならOK。
スクリーンショット 2023-11-13 9.34.13.png

Google Siteでプライバシーポリシーのページを用意して公開しました。
スクリーンショット 2023-11-13 9.27.07.png

プライバシーポリシーのサイトはこちら

設定したプライバシーポリシーは、ユーザーがGPTsを実行する時に確認ができます。
スクリーンショット 2023-11-13 9.26.51.png

考察

Google Apps Scriptのデプロイ方式について

デプロイ方式は「ウェブアプリ」の他に「実行可能API」もあります。
「実行可能API」で試したところ、Google Apps Scriptにデータがうまく渡されなかったので、今回は「ウェブアプリ」のデプロイ方式を採用。

Custom ActionsからGoogle Apps ScriptのAPIにデータを渡すところ

Schemaの設定

"id" が4桁の数字の番号にあたります。
数字ではなく文字列として渡しています。
GPTsはこのSchemaの設定を元に、ユーザーからの質問文を解析して、4桁の数字の番号を抜き出して、APIにデータを渡します。
スクリーンショット 2023-11-13 6.55.37.png
APIに渡すデータを増やしたい場合は、赤枠で囲った部分をコピーして、カンマ "," で区切ってコピーします。

Google Apps Scriptのコード

JSON形式でデータを受信して、JSON形式のデータから id を取り出し、searchQuery変数に代入
スクリーンショット 2023-11-13 12.16.07.png

Google Apps ScriptのAPIからCustom Actionsにデータを返すところ

Google Apps Scriptのコード

searchQuery変数でGoogleスプレッドシートを検索し、ヒットしたら
苗字 → lastname
名前 → firstname
でJSON形式のデータを作成して、返します。
スクリーンショット 2023-11-13 12.19.36.png

Schemaの設定

受信したJSON形式のデータから
lastnameとfirstnameを取得し、GPTsがそれを日本語に置き換えて、ユーザーに回答します。
スクリーンショット 2023-11-13 10.15.21.png
やり取りするデータを増やしたい場合は、赤枠で囲った部分をコピーして、カンマ "," で区切ってコピーします。

おわりに

今回紹介したGPTsからGoogleスプレッドシートのデータを取得するのは、Zapier使えばノーコードでできます。

Zapierの無料プランの制限を気にせず運用したい場合や、もっと複雑なことやりたい場合にGoogle Apps Scriptを使ってみるのはいかがでしょうか。

JavaScriptのプログラミングが必要ですが、ChatGPTでプログラムしてもらえる時代です。
ここで紹介しているコードもChatGPTをつかって書きました。
→もちろんデバッグや、多少の手直しは自分でやっております。

Google Apps Scriptを改造すれば、例えばGoogleスプレッドシートに独自の英単語帳を作って、ランダムにGPTsに返すことも可能です。

Googleスプレッドシートに連携するAPIのいいところは、データの更新が楽なこと。
更新の都度、GPTsの設定画面を開いて、ファイルをアップロードする必要がないので、常に最新のGoogleスプレッドシートの情報を取得できます。

GoogleスプレッドシートだけでなくGoogleドキュメントやGmail、Googleカレンダーと連携すれば、アイディア次第でGPTsの活用がいろいろ広がりそうです。

この記事を参考にご自身でCustom ActionsのAPIを開発する際の一助になれば、幸いです。

最後までご精読いただき、ありがとうございました。

補足

初めてデプロイ後に、Google Apps Scriptを編集した場合、こちらの手順でデプロイします。
「デプロイを管理」を選択。
スクリーンショット 2023-11-13 9.22.42.png
右側のペンのアイコンをクリック
スクリーンショット 2023-11-13 11.32.41.png
一旦、バージョンをクリックして、
スクリーンショット 2023-11-13 11.32.50.png
新バージョンを選択して、デプロイします。
スクリーンショット 2023-11-13 11.33.04.png
この手順でデプロイすれば、デプロイのURLは変更されません。
→GPTsのCustom ActionsのSchemaを編集する必要はありません。

参考資料

Google - Google サイトの使い方
https://support.google.com/sites/answer/6372878?hl=ja

107
98
3

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
107
98