ChatGPT「Function Calling」をGoogle Apps Script (GAS) で検証

# 2023年8月13日 追記対応

Udemy講座として、ChatGPT APIの Function Calling に解説しながら Google Apps Script (GAS) で LINEbot を作る講座を作成しました。2時間半以上かけて丁寧に解説してますので、もしよければご参考にしてください！

◆ [ChatGPT API 新機能「Function Calling」で LINEbot 入門](https://www.udemy.com/course/chatgpt-line-function-calling-ai/?referralCode=509DE0E479928C2939C1)
[https://www.udemy.com/course/chatgpt-line-function-calling-ai/?referralCode=509DE0E479928C2939C1](https://www.udemy.com/course/chatgpt-line-function-calling-ai/)

<iframe width="560" height="450" src="https://www.youtube.com/embed/2L4ql0zNCFI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# はじめに
数あるChatGPT記事から、こちらの記事を見つけていただき誠にありがとうございます！
ドイツのベルリンに住んでいます。仲条高幸（ナカジョウタカユキ）と申します。
Twitter：https://twitter.com/njn0te

今回は、2023年6月13日に新しく機能として追加された「Function Calling」を使います。GoogleのサービスをAIで気軽に呼び出せたら良いなと思い、Google Apps Script (GAS) で「Function Calling」を呼び出してみた実験結果を、Qiita記事として残します。

## 下準備 Googleスプレッドシート

[新しくスプレッドシート](https://spreadsheet.new)を開きます。お好みでA1のセルに、ChatGPTの設定をお書きください。サンプルも下記に載せておきます。

![スクリーンショット 2023-07-14 9.01.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/cf2157c7-037a-1657-f622-9013be26ab19.png)

```
#命令書 
あなたは中華料理のエキスパートです。以下の制約条件に従って答えを導いてください。
 
#制約条件 
・適度に語尾に「アルよ」をつけてください
```

## YouTubeで解説

<iframe width="560" height="450" src="https://www.youtube.com/embed/7EVi8ptQNbE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

参考動画（1つ前の動画）: https://youtu.be/UHDSHxVCGLk
「LINE × ChatGPT」ライブ配信動画: https://youtube.com/live/Hh5x-CmuX9w

## OpenAI社のAPIを発行

ChatGPTをプログラミングから実行するためには、OpenAI社のAPIを発行する必要があります。下記の動画を参考に、使えるようにしてください。

<iframe width="560" height="450" src="https://www.youtube.com/embed/HpnD8bdtYLA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

OpenAI API Key 発行ページ: https://platform.openai.com/account/api-keys

# プログラム

メニューバーの「拡張機能」から「Apps Script」を選択します。

![スクリーンショット 2023-07-14 8.48.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/17311e44-4738-fe8a-15a5-b4b3730f5d89.png)

下記のデフォルトのコードは使わないので、全部選択してdeleteで消してください。

```コード.js
function myFunction() {
  
}
```

代わりに、下記のコードをコピーして貼り付けてください。

```js:ChatGPT.gs
// 使用API
const OPENAI_APIKEY = "sk-*************************"; // 発行したOpenAI社のAPIを貼付け
const LINE_REPLY_URL = 'https://api.line.me/v2/bot/message/reply';
const CHAT_GPT_URL   = "https://api.openai.com/v1/chat/completions";
const CHAT_GPT_VER   = "gpt-3.5-turbo-0613"; // or gpt-4-0613

// スプレッドシートの情報
const SS    = SpreadsheetApp.getActiveSpreadsheet();
const SHEET = SS.getSheetByName('シート1');

function chatGPT(prompt) {
  prompt = "おすすめの中華料理を５つ教えて"
  // prompt = "***********@gmail.com に、おすすめの中華料理を５つ送ってください。メールの送信相手は20代の女性です。"
  let constraints, return_text
  try {
    constraints = SHEET.getRange(1, 1).getValue()
  } catch (e) {
    console.log("制約なし")
  }
  const requestOptions = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer "+ OPENAI_APIKEY
    },
    "payload": JSON.stringify({
      "model": CHAT_GPT_VER,
      "messages": [
        {"role": "system", "content": constraints}, // Who you are?
        {"role": "user", "content": prompt} // prompt
       ],
       "functions": [
          {
            "name": "send_email", // function name
            "description": "メールを送信する",
            "parameters": {
                "type": "object",
                "properties": {
                    "email": {
                        "type": "string",
                        "description": "メールアドレス",
                    },
                    "body": {
                      "type": "string",
                      "description": "本文",
                    },
                    "subject": {
                      "type": "string",
                      "description": "件名",
                    }
                },
                "required": ["email"],
            },
          },
        ],
        "function_call": "auto"
    })
  }
  const response = UrlFetchApp.fetch(CHAT_GPT_URL, requestOptions)
  const responseText = response.getContentText()
  const json = JSON.parse(responseText)
  if (json.choices[0].message.function_call) {
    const function_name = json.choices[0].message.function_call.name
    const function_arguments = JSON.parse(json.choices[0].message.function_call.arguments)
    if (function_name === 'send_email') {
      return_text = send_email(function_arguments.email, function_arguments.body, function_arguments.subject)
    }
  } else {
    // function calling が実行されなかった場合、ChatGPTの返答として返す。
    return_text = json['choices'][0]['message']['content'].trim()
  }
  console.log(return_text)
  return (return_text)
}

// メール送信
function send_email(email, body, subject) {
  const options = {name: "ChatGPTからのお知らせ"} // オプション
  MailApp.sendEmail(email, subject, body, options) // 送信
  const text = `「${subject}」というメールを ${email} に送りました`
  return (text)
}
```

貼り付けたら、2行目の`sk-*************************`部分を発行したOpenAI社のAPIに書き換えたら保存をして、上の方にある「実行」というボタンを押してください。

![スクリーンショット 2023-07-14 9.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/4032894d-4ee4-d674-ed50-2540eb16d90b.png)

## 実行時の権限承認

権限など聞かれましたら、下記の手順で承認してください。

### ①アカウントの選択

使用するGoogleアカウント（メールアドレス）を選択してください。

![スクリーンショット 2023-07-14 5.00.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/2bc1c684-02cb-4a0b-5648-0a874a3e162d.png)

### ②詳細から移動

右下の「安全なページに戻る」ではなく「詳細」から「移動」を選択してください。

![スクリーンショット 2023-07-14 5.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/fe043e4d-b4f5-f38a-0440-179d389ca74e.png)

### ③許可

- Gmailの送信
- スプレッドシートとの連携
- Googleカレンダーへのアクセス
- ChatGPTへのアクセスなどの外部サービスとの接続 
これらのを聞かれるので、「許可」を選択してください。

![スクリーンショット 2023-07-14 5.02.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/42635504-918a-3024-a96d-4d06649bb570.png)

まずは、画面下の「実行ログ」に、ChatGPTからの返答が帰ってきていれば成功です。

## Function Calling でメール送信

ではいよいよ、「Function Calling」を使用して、イイ感じに「メールアドレス」を取得＆「件名」と「本文」を生成して、メール送信していきます。

プログラムの12行目をコメントアウトして、13行目のコメントアウトを外してください。
***********@gmail.comの部分も、実際に届いて確認できるメールアドレスに変更してください。

```js:ChatGPT.gs
  // prompt = "おすすめの中華料理を５つ教えて"
  prompt = "***********@gmail.comに、おすすめの中華料理を５つ送ってください。相手は20代の女性です。"
  // prompt = "来月の18日午後3時から4時まで渋谷でショッピングする予定を追加して"
```

これで実行してみてください。メールが送信できていれば成功です。
下記プログラムの部分が今回の「Function Calling」で、既存のChatGPTの操作に追加できる機能です。メールを送信する関数「send_mail」を呼び出しています。

```js:ChatGPT.gs
{
  "name": "send_email", // function name
  "description": "メールを送信する",
  "parameters": {
      "type": "object",
      "properties": {
          "email": {
              "type": "string",
              "description": "メールアドレス",
          },
          "body": {
            "type": "string",
            "description": "本文",
          },
          "subject": {
            "type": "string",
            "description": "件名",
          }
      },
      "required": ["email"],
  },
}
```

実際にメールが送信できれば成功です。

# 考察

Googleの機能を、曖昧な文章でもAIの力を借りて呼び出し放題ですね。しかもGoogle側は完全に無料でできてしまいます。他にも、既存のWebサービスに今回の「Function Calling」を実装することで、強力なアプリケーションも作れそうですね。例えば、LINEのチャットボットとの連携も簡単に、しかも無料でできてしまいます。LINEとの連携に関しては、別で記事を書いたり動画を出していたりしていますので、今回の記事も参考にご活用ください。

◆ note記事『[【LINE × ChatGPT 完全解説】非エンジニアでもAIチャットボット開発｜スプシとGAS（Google Apps Script）作り方の決定版](https://note.com/njn0te/n/n2db544076e86)』

https://note.com/njn0te/n/n2db544076e86

◆ YouTube『[Web API とスクレイピングを学びながらGoogle Apps Script で簡単にできるLINE BOT 作り方](https://youtube.com/live/OLz6hNCgM0k)』

https://youtube.com/live/OLz6hNCgM0k

## 公式の発表時の記事とドキュメント 

詳細は、OpenAIが公式で発表している [Function calling and other API updates](https://openai.com/blog/function-calling-and-other-api-updates) や[ドキュメント](https://platform.openai.com/docs/guides/gpt/function-calling)をご確認ください。

◆ Function calling and other API updates

https://openai.com/blog/function-calling-and-other-api-updates

◆ Function Calling ドキュメント

https://platform.openai.com/docs/guides/gpt/function-calling


## Udemy講座に関して

GASの基礎講座などを出しています。

◆ [ChatGPT API 新機能「Function Calling」で LINEbot 入門](https://www.udemy.com/course/chatgpt-line-function-calling-ai/?referralCode=509DE0E479928C2939C1)

https://www.udemy.com/course/chatgpt-line-function-calling-ai/?referralCode=509DE0E479928C2939C1

◆ [【Google Apps Script 超入門講座】2時間で知識ゼロから基礎をマスター](https://www.udemy.com/course/googleappsscript/?referralCode=9EC52D89F0F5F497933A)

https://www.udemy.com/course/googleappsscript/?referralCode=9EC52D89F0F5F497933A

◆  [1時間でWeb API とスクレイピングを学びながらGoogle Apps Script で簡単にできるLINE BOT](https://www.udemy.com/course/web-api-scraping-gas-linebot-tsfcm/?referralCode=7E2EB0DD484E08FA1413)
 
https://www.udemy.com/course/web-api-scraping-gas-linebot-tsfcm/?referralCode=7E2EB0DD484E08FA1413

役に立つ情報を発信していけるように頑張っていますので、今後も暖かく見守っていただけると幸いです！