Office ScriptからGPTを利用する方法 - AI Builderバージョン

# はじめに
20203/8/23の`Python in Excel`の機能は大変盛り上がりましたね！
**Python Lover** の一人としても非常に楽しみな機能ですが、
使用できるライブラリはあくまで限定的であり、用途は限られます。

**Python in Excelで使用できるライブラリ**
- json
- Matplotlib
- NumPy
- pandas
- scikit-learn
- SciPy
- Seaborn
- statsmodels
- regex

詳しくは[公式のレファレンス](https://support.microsoft.com/ja-jp/office/excel-%E3%81%A7%E3%81%AE-python-%E3%81%AE%E6%A6%82%E8%A6%81-55643c2e-ff56-4168-b1ce-9428c8308545)をどうぞ

https://support.microsoft.com/ja-jp/office/excel-%E3%81%A7%E3%81%AE-python-%E3%81%AE%E6%A6%82%E8%A6%81-55643c2e-ff56-4168-b1ce-9428c8308545

SNSを拝見すると、特にニーズが高そうなライブラリは[requests](https://pypi.org/project/requests/)なのかなと。

https://pypi.org/project/requests/

こちらは`Power Automate`と`Office Script`を活用することで実装できたりするので、
アウトプットを残します。

それでは本編をどうぞ～

# 大変参考になる記事
Power Platform界隈では、この方は最強ですね・・・。調べると全部載っていらっしゃる・・・。

https://mofumofupower.hatenablog.com/entry/2021/02/18/014249

合わせて先日私が書いたQiitaの記事もどうぞ～

https://qiita.com/DEmodoriGatsuO/items/904df5caa74c60fd8038

## Python in Excel はこちら
この方は本当に、もはや速すぎて衝撃です・・・。

https://www.ka-net.org/blog/?p=15810

:::note info
`Python in Excel`の発表当日に記事出されてました💦
:::

# 1. Power Automate側の設定
## まずは全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/198e20d3-8441-26c2-b188-750e769d081e.png)

Power Automateの文字列はデフォルトのものを使っているので、検索すると同様のものが出てきます。

:::note warn
`GPTでテキストを作成する`機能はプレビューで使用条件ありです。
詳しくは下記をどうぞ。

20203.08.24 時点
:::

https://learn.microsoft.com/ja-jp/ai-builder/azure-openai-model-pauto

`GPTでテキストを作成する`機能は`ChatGPT API`に置き換えてもいいと思います。
それも合わせて後述しますね。

### 1. 自動化したクラウド フローで`HTTP 要求の受信時`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/136d7ac1-dbae-acaa-2e6f-0659fc69694b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/52de8823-9e90-cc68-fc49-70f74548b1d4.png)

Webhookなどで利用する方法ですね。

**HTTP 要求** は`POST`形式で、`URI`はフロー作成時に自動生成されます。

本文(body)は自分で定義することが出来るので、
とりあえずテキストオブジェクトだけ送る形式にしましょう。

```json:スキーマ
{
    "type": "object",
    "properties": {
        "prompt": {
            "type": "string"
        }
    }
}
```

JSONのスキーマで`prompt`をAPIに渡し、GPT利用の際に使用します。
この方法は他のAPI利用時にも使えそうですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/33358fc2-f7b8-985b-6629-23e8903fcb3d.png)

まったく同じがご希望であれば、上記のスキーマを`要求本文のJSON スキーマ`にコピペしてください。

### 2. GPT でテキストを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2767d146-2d8b-2bea-54c2-ffea18d1c8d5.png)

繰り返しになりますが、あくまで`プレビュー機能`です。
別の手段として`ChatGPT API`の利用などが良いかと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4c0c8d0c-80f7-9ee3-3106-b5f30da3e814.png)

GPTのAPIの記事はとても多いので、説明は省きます。

### 3. 応答 で`GPT でテキストを作成する`の結果を返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c32cbb31-4020-d34a-d092-c5fae579b71e.png)

```json:戻り値
{
  "result": "@{outputs('GPT_でテキストを作成する')?['body/responsev2/predictionOutput/text']}"
}
```

こちらも後述するOffice Scriptに合わせて、自分で定義をしています。
見ての通り**Power Automateの方はとても単純です。**

API Keyも不要なので`AI Builder`最高過ぎます・・・
※ライセンスがないと使えません

# 2. Office Script
シナリオは下記の通りとします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c79d5018-daee-bc56-fa01-4ff8a322a5a3.png)

画面は`Excel on Web`です。Microsoft 365のExcelであれば、アプリでも同様になります。

> セルA2にプロンプトを入力したら、セルB2に結果が返る

こういったシナリオにしましょう。

## コード

```typescript:Office Script
async function main(workbook: ExcelScript.Workbook): Promise<void> {
    // Your code here
    const apiUrl = 'こちらにPower Automateで生成されたHTTP 要求受信時 HTTP POST の URLを設定';

    // Excelのシートを取得
    const targetSheet = workbook.getWorksheet("Sheet1");

    // シートから入力セル（A2セル）の値を取得
    const userInput = targetSheet.getRange("$A$2").getValue();

    // Webサービスに送信するデータオブジェクトを作成
    const requestData = { prompt: userInput };

    // Webサービスのリクエストパラメータを設定
    const requestOptions =
    {
        method: "POST",
        headers:
            { "content-type": "application/json" },
        body: JSON.stringify(requestData)
    };

    // Webサービスにリクエストを送信し、結果を待つ
    const response = await fetch(apiUrl, requestOptions);

    // レスポンスデータをJSON形式で解析
    const jsonResponse: JSONData = await response.json();

    // シートの結果表示セル（B2セル）に結果を設定
    targetSheet.getRange("$B$2").setValue(jsonResponse["result"]);

    // 結果をコンソールにも出力
    console.log(jsonResponse["result"]);
}

// JSONデータの型を定義
interface JSONData {
    result: string
}
```

`JSON`の方は作成者の自由に設定できます。今回はテキストだけでいいです。
**こちらを実行すると・・・**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/8a9293ac-72c7-240e-fbd6-a4c8aa59efc3.png)

**じゃじゃ～ん**
**HTTP 要求が実装出来ました！**

# 最後に
カスタム関数にするには、準備が必要になりそう・・・。
なので研究を進めます！

https://learn.microsoft.com/ja-jp/office/dev/add-ins/quickstarts/excel-custom-functions-quickstart?tabs=excel-windows

個人的には`Python in Excel`も楽しそうですが
**Office Scriptもいいぞ～** ということで締めたいと思います！