独自性の強いGPTsを作る方法(GoogleSpreadSheet連携)

# はじめに

みなさんGPTs作ってますか？

プロンプトをいじるだけでも大変有用なGPTを自作できますが、ある程度試すとどれも同じようなGPTになってしまいます。

独自性を出すためには、APIとの連携が重要になってくるのですが、簡単に試すときにいちいちAWSなどにサーバーを建てるわけにもいきません。


そこで今回は、GoogleSpreadSheetとGAS(GoogleAppScript)を用いて簡単に無料のAPIエンドポイントを作成し、APIを用いたGPTsを作成する方法を解説します。


この記事の内容から、以下のようなGPTsが作成できます。

## 20 Questions Bot
「はい」か「いいえ」で答えられる質問を繰り返して、隠されているお題を当てるゲーム

https://chat.openai.com/g/g-ALkOyNGMb-20-questions-game

## アイディエーション Bot
テーマを与えると様々な技術・ユーザーと組み合わせて事業アイデアを生成する

https://chat.openai.com/g/g-FNQh4NObI-aideaman

# やり方

20 Questions Botを例に解説していきます。

20 Questions Botでは、ゲームのお題となる単語を、GoogleSpredSheetのデータからAPIを用いてランダムに取得しています。

やり方は下記の通りです。

1. Googleスプレッドシートを作成し、データを用意する
1. Google App Scriptを作成する
1. APIをデプロイする
1. Google Sitesにプライバシーポリシーを用意する
1. GPTsを作成する
    1. Instractionを設定する
    1. ActionsにデプロイしたAPIのエンドポイントなどを設定する
    1. プライバシーポリシーを設定する


## 1. Googleスプレッドシートを作成し、データを用意する
こんな感じでデータを用意します。
今回は20Questionsをするためのお題を用意しています。
お題はGPTに200以上作成させてます。

![スクリーンショット 2023-11-18 23.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407360/b121bbdf-b2e0-b963-d031-b5d5a3fa57a7.png)


## 2. Google App Scriptを作成する
以下のように、拡張機能からApps Scriptを選択してGASを作成してください。
![スクリーンショット 2023-11-18 23.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407360/fba5f88f-16be-0833-61eb-94d3938ea268.png)

作成したら、以下のスクリプトを貼り付けてください

```javascript
function getRandomValueFromSheet(sheetName) {
  var sheet = SpreadsheetApp.openById(/*スプレッドシートID*/).getSheetByName(sheetName);
  var range = sheet.getRange(1, 1,sheet.getLastRow()-1);
  var values = range.getValues();
  var flatValues = values.flat();

  var randomIndex = Math.floor(Math.random() * flatValues.length);
  return flatValues[randomIndex];
}

function doGet(){
  var mysteryObjects = getRandomValueFromSheet("MysteryObjects")
  
  return ContentService.createTextOutput(
    JSON.stringify({
      'misteryObject' : mysteryObjects,
    })
  ).setMimeType(ContentService.MimeType.JSON)
}
```

スプレッドシートIDはスプレッドシートのURLから取得できます。

以下のようなURLの場合、`8dgE4gFpMvsXU8I085Si-dId23t-oX3u_1wTVgwzBIDU`がIDになります。
https://docs.google.com/spreadsheets/d/8dgE4gFpMvsXU8I085Si-dId23t-oX3u_1wTVgwzBIDU/edit?usp=sharing

## 3. APIをデプロイする

右上のデプロイボタンから「新しいデプロイ」を選択してデプロイします。

![スクリーンショット 2023-11-18 23.21.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407360/873f8ce3-8638-048c-ecd6-c560c7ebe895.png)

「種類の選択」ではウェブアプリを選択
「アクセスできるユーザー」は全員を選択
![スクリーンショット 2023-11-18 23.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407360/69f59e74-74f6-5d9f-2927-22b058f72b43.png)


デプロイIDが表示されるので、メモする。


## 4. Google Sitesにプライバシーポリシーを用意する

API連携したGPTsを一般に公開するためにはプライバシーポリシーが必要になります。

[Google Sites](https://sites.google.com/?hl=ja)に無料でサクッと用意しておきましょう。

参考までに、私が用意したプライバシーポリシーは[こちら](https://sites.google.com/view/tom-gpt-app-privacy-policy)です。


## 5. GPTsを作成する

[GPTs Editor](https://chat.openai.com/gpts/editor)からGPTsを作成します。

Configureを開いて、必要事項を入力しましょう。

Instructionsには以下を入力してください。

```
The objective of this GPT is to play 20 Questions.
You play as the questioner.
The language to be used is initially specified by the user.

# Procedure
Step 1: User selects the language to be used.


Step 2: GPT retrieves the MysteryObject using getMysteryObject


Step 3: User asks a question that can be answered with YES or NO


Step 4: GPT answers the question with YES, NO, or I don't know
YES
19 remaining

NO
10 times remaining

I don't know
3 times remaining


Repeat steps 3 and 4 until the number of remaining times reaches zero.
When the number of remaining times becomes zero, or when the MysteryObject is guessed, the answer is displayed.


# Supplementation
You can basically only say YES, NO, or I don't know.
Only when the number of remaining times reaches 10 or 5 can you ask the user if a hint is needed.
When asked for a hint, please give a minimal hint.
```

![スクリーンショット 2023-11-18 23.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407360/ca16876e-e314-4fd2-867f-05fe224a3f1b.png)

Create new action ボタンを押し、Schemaに以下を入力しましょう。
pathsのデプロイIDは、APIをデプロイした時に表示されたものを入力してください。

```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Get Mystery Object",
    "description": "Get Mystery Object for 20 Questions.",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://script.google.com"
    }
  ],
  "paths": { "/macros/s/デプロイID/exec": {
      "get": {
        "description": "Get Mystery Object",
        "operationId": "GetMysteryObjects",
        "parameters": [],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {
      "NameResponse": {
        "type": "object",
        "properties": {
          "mysteryObject": {
            "type": "string"
          },
        }
      }
    }
  }
}
```


最後にPrivacy policyに作成した、プライバシーポリシーのURLを貼り付けたら、右上のSaveボタンを押して、GPTsを公開しましょう。


# 最後に

GPTsはもっともコストがかかるGPTの部分をユーザーが負担するので、様々なアイデアを最低限のコストで実現できるところが良いですよね。

他にも以下のようなGPTsを作成しているので、みなさん使ってみてください。

## ピクトグラムメーカー

簡単にピクトグラムを作成できる

https://chat.openai.com/g/g-oP2iNDH00-pikutoguramumeka

## ビジネスで使える画像生成

スライドなどで使いやすい画像を簡単に生成できる。

https://chat.openai.com/g/g-qoEK08w6q-bizinesudeshi-eruhua-xiang-sheng-cheng


## ペルソナメーカー

様々なペルソナをクイックに作成できる

https://chat.openai.com/g/g-4vzSCf0sL-perusonameka