会話から自動処理へ:JSON を使って外部システムとつなぐ“最小で壊れない”エージェント作成 中級No3

Power Automate を使わずに会話から Excel への書き込みまでを、シンプルに実現する仕組みを解説します

はじめに:会話から実行へ

Copilot Studio は「会話」だけでなく「実行」までできます

今回はその実行の構成を“最小”で作ります

エージェントは会話開始トピックで注文内容を聞き、そのままSharepoint内のエクセルファイルににその内容を書き込みます

とにかくシンプルな構成がベストです

シンプルであれば壊れにくく、面倒な更新処理や同期処理も発生しません

ただし、シンプルな構成にするには1つ重要なことがあります

JSONを使うことです

「え、JSONなんて使ったことがない・・・」

大丈夫です

このブログでは生成AIへ貼るプロンプトも提供いたします

なお、

当ブログでは上記のようなシーケンス図などをMermaidコードで書くことを推奨しています

なぜ JSON なのか?(外部とのやり取りは JSON が標準)

JSONとはなんなのか?

手っ取り早く見てみましょう!

URLに以下の{}内を修正したうえでコピーしてくみてください

https://zipcloud.ibsnet.co.jp/api/search?zipcode={1620827}

上記の画像では〒「1620827」の住所情報がかえってきています

一部、エクセルのシートで表現すると下の画像のような形になります

JSONの目的

JSONは“データを正しく、わかりやすく、機械同士でやり取りするため”**のものです

人間にも読みやすく、コンピューターにも扱いやすい形で データを整理して渡すためのフォーマットになっています

上記の例でいえば、郵便番号を送ると、 住所が JSON という形で返ってくる。

これは、 「住所という情報を、決まった形で返す」 という目的のために JSON が使われています。

JSONの役割

API や外部システムは、 それぞれ独自の仕組みで動いています。

でも、 データの受け渡しだけは世界共通のルールが必要です。

その役割を担っているのが JSON。

データを整理して渡す(構造化)

住所データなら:

  • 都道府県
  • 市区町村
  • 町名
  • 郵便番号

といった項目を 名前(キー)と値(バリュー)で整理して渡せる。

例:

コード

"address1": "東京都"

どの言語・どのシステムでも扱える(共通フォーマット)

JSON は:

  • JavaScript
  • Python
  • C#
  • Copilot Studio
  • Power Automate
  • Web API

どれでも扱える。

つまり、 「どんなシステムともつながるための共通言語」 という役割を持っています。

人間にも読みやすい(学習コストが低い)

XML よりもシンプルで、 初心者でも「なんとなく読める」。

だから、 API の結果を理解する最初のステップとして最適です。

一言でまとめると

JSON は、外部サービスとデータをやり取りするための “世界共通の入れ物”であり、“会話のための言語”。

Copilot Studio も、郵便番号 API も、Excel 連携も、 すべてこの JSON を使って情報をやり取りしています。

JSON の文法

JSON は、 “名前(キー)と中身(値)をセットで並べるだけ” という、とてもシンプルな文法でできています。

1. 基本の形:キーと値のセット

JSON の最小単位はこれです。

コード

"キー": 値

住所の例だと:

コード

"address1": "東京都"
  • "address1" → 名前(キー)
  • "東京都" → 中身(値)

という意味になります。

2. 複数のデータは { } の中に入れる

住所データをひとまとめにすると、こうなります。

コード

{
  "address1": "東京都",
  "address2": "新宿区",
  "address3": "若宮町"
}

ポイント:

  • { } は「ひとまとまりの情報(箱)」
  • 各行は "キー": "値" のセット
  • 行と行の間は カンマ , で区切る

3. 列(リスト)は [ ] で表す

API では、住所が複数返る可能性があるため、 リスト(配列) という形で返されます。

コード

"results": [
  { 住所データ1 },
  { 住所データ2 },
  ...
]

*住所データ:address1,address2,address3・・・

今回は 1 件だけですが、 “複数入るかもしれない箱” だと思えば OK です。

4. 今回の郵便番号 API の JSON を文法で読むとこうなる

コード

{
  "message": null,
  "results": [
    {
      "address1": "東京都",
      "address2": "新宿区",
      "address3": "若宮町",
      "zipcode": "1620827"
    }
  ],
  "status": 200
}

文法的に分解すると:

  • { } → 全体のデータの箱
  • "message": null → メッセージは空
  • "results": [ { … } ] → 住所データのリスト
  • { "address1": "東京都", ... } → 1件目の住所データ
  • "status": 200 → 成功

以上のようになります

JSONについての解説は以上となりますが、少なくとも現段階で全部覚える必要はありません

「JSONとはこういうものだ」という風に感じてもらえれば幸いです

なぜエージェントフローや Power Automate を使わないのか?

今回の内容は会話から取得した内容をSharepoint上のエクセルファイルに書き込む内容です

なのに、なぜエージェントフロー*やPower Automateを使わないのか?と疑問に持つ方もいらっしゃると思います

*Copilot Studio内でPower Automateと同等の機能を提供するもの

一見すると、Power Automate を使ったほうが高機能で便利に見えます。

しかし、中級編で最初に学ぶべき構成は「Power Automate を使わない」ほうです。

理由はシンプルで、

Power Automate を使うと壊れやすい。 トピック内で完結させると壊れない。

この一点に尽きます。

上の図で②③の連携の際にエラーが起こりやすいからです

① 入力パラメータ名(変数名)、パラメーター数を変えた

→ Copilot Studio 側のバインド(紐づけ)が壊れる

❌ ② フロー名を変えた

→ Copilot Studio がフローを見失う

❌ ③ Excel の列名を変えた

→ JSON のキーが一致せずエラー

❌ ④ トピックを複製した

→ text_1 / date のような謎の変数名が発生

❌ ⑤ フローを保存したが、Copilot Studio 側で「フロー更新」を押し忘れた

→ 古い構造のまま実行されて失敗

Power Automate は強力ですが、 「更新に弱い」という致命的な特徴があります。

後、2点あります

単純に、トピック内で完結すればとてもシンプルな構成になるという点が1点あります

2点目ですが、Power Automateでプレミアム契約がないと利用できるものが制限されることがあります

Copilot Studioのトピック内であれば独自の契約なので、プレミアム契約の制限は受けません

ですので以降、Power Automateを使いわない構成で記事を進めていきます

実際に作ってみる(会話 → JSON → Excel 書き込み)

今回の内容はハンバーガーショップで注文を受けて、注文内容をエクセルファイルに書き込むという想定です

まず、新しくエージェントを作成しましょう

必要データの準備

今回のエージェントでは、以下の画像のようなデータ構成にします

最終的には、以下の内容をエクセルに書き込みます

注文日時(会話の開始トピックでは変数:dateCurrent)

注文者(会話の開始トピックでは変数:strName)

商品名(会話の開始トピックでは変数:SelectedProduct)

エクセルファイルの準備

まず、Sharepointサイトにエクセルファイルを準備しましょう

そしてエクセルファイル内に下記のようなテーブルを準備しましょう

テーブル名は「注文受付」としました

エンティティの準備

今回は商品名については選択肢にします

ですので、エンティティを準備する必要があります

今回は「Menu」というエンティティを用意しました

会話の開始トピックの作成

エージェントを新規に作成したら、システムトピックから「会話の開始」トピックを開いてください

エージェントやPower Automateは使用しないですが、外部との連携は必要最低限は発生します

変数などは極力、英語を使用した方が無難です

英語の方がエラーの発生可能性は低くなります

注文日時

注文日時は自動で設定します

まず、デフォルトで設定されている「メッセージを送信」カードは3点リーダーから削除します

代わりに「変数値を設定する」カードを設定しましょう

「変数値を設定する」カードはトリガーブロックの下の+を押して「変数管理」から選択します

これで下の画像のように「変数値を設定するカード」が設定できます

設定する値については起動した「日」を設定します

この場合、Power Fxを使用しますので三点リーダーをクリックしてください

その後、上記の画像の右側で「計算式」をクリックします

上の画像はPower Fxを設定した状態です

以前の記事でも解説しましたが、Now()関数で取得した内容はタイムゾーンの調整が必要です

なお、今回は調整した内容を書き込む際に「yyyy-MM-dd」形式への調整も必要になります

Text(DateAdd(Now(),540,TimeUnit.Minutes),"yyyy-MM-dd")

設定する変数名については上の画像では「dateCurrent」と英語で設定しています(種類:String)

英語にしている理由は前述の通り、エラー発生予防のためです

注文者名

注文者名については質問で取得します

本来であればデフォルトで設定されている「個人名」を上の画像のように使用すべきところです

ところが、ここがややこしいのですが「個人名」だと英語に変換されます

なので苦肉の策なのですが、特定(エンティティ)は以下を設定します

「ユーザー」の文字列で検索して、「ユーザーの応答全体」を設定します

つまり、ユーザーの応答をそのまま変数に格納して使用します

「鶴岡です」と応答があれば注文者名が「鶴岡です」になりますが、今回はそのまま使用します

上の画像のように変数名は「strName」にします

注文商品名

注文商品は質問カードを設定し、先ほど設定したエンティティ:Menuを使用して選択肢をユーザーに表示します

この時、上の画像の一番下の変数の種類に注目してください

文字列形式ではありません

choice(選択)形式となっています

あくまでエクセルに書き込むのは文字列形式の値です

ですので、そのままでは使用できませんので変換が必要です

変換は「変数の設定」カードを使用します

下の画像のように変数:strProduct(Topic.strProduct)をText関数で文字列に変換します

*計算式内で変数を指定するには「Topic」と必ずつけてください

設定する変数名については「selectedProduct(string)」にします

エクセルへの書き込み

アクションの追加

上記までは、エクセルに書き込むための内容を変数に設定してきました

ここからは実際にエクセルに書き込む機能を作成します

エージェントやPower Automateを使用しないので1カードで済みます!

まず、質問カードの下の+をクリックして「ツールを追加する」の右側の矢印をクリックします

上の画像の黄色の箇所をクリックする下の画像のようにツールを選べるようになります

さらに上の画像のように「コネクタ」を選択して「表に行を・・・」と検索すると「表に行を追加」アクションが選択できます

さらに次のような画面が開くので「送信する」をクリックしてください

下の画像のように新たなアクションが追加されます

残念ながらUIは全部英語にはなってしまいます

アクションの設定

ここからは下の画像の入力の箇所をクリックして各種項目を設定していきます

Location :Sharepointサイト

下の画像のLocationにはエクセルファイルが存在するSharepointサイトを設定します

上の画像の下向きの矢印(三点リーダーではない)をクリックすると下の画像のようにSharepointサイトを選択できます(SharepointサイトにはGroupとついています)

Document Library :格納フォルダ

Sharepointサイトを設定すると、該当サイト内のフォルダを設定できます

下の画像の下向きの矢印をクリックします

もし何も表示されない場合は、下の画像のよう「更新」をクリックします

そして、もう一度、前述の矢印をクリックすると下の画像のようにフォルダが表示されます

File :エクセルファイルおよびテーブル

Fileについては、下の画像のフォルダマークから設定します

フォルダ内のファイルがすべて表示されます

もし、ファイル名が意味不明な文字列になっても問題はありません

ファイルの下のテーブルについても同様です

Row :JSON形式を使用して「注文日~注文商品名」を設定

前述したJSON形式をここで使用します

JSON形式は以下のようなプロンプトを使用して生成AIに書いてもらいましょう

次の Excel テーブルの列名に対応する Power Fx のレコード構文を作ってください。
列名:
- 注文日時
- 注文者
- 商品名

対応する変数:
- 注文日時 → Topic.dateCurrent
- 注文者 → Topic.strName
- 商品名 → Topic.SelectedProduct

Power Fx のレコード構文で出力してください。

生成AIの回答は以下のようになっているはずです

{
    注文日時: Topic.dateCurrent,
    注文者: Topic.strName,
    商品名: Topic.SelectedProduct
}

こちらをPower Fxの入力欄(計算式)にコピーしましょう!

これで完成です

実際に動かしてみる

それでは新しいテストセッションから動かしてみましょう!

商品を選択すると、エクセルの書き込みが始まります

ここで最初に動かすときは以下の「許可依頼」が必ずでます

つまり、以下の画像のように「コネクタ」から選択したので当然、どこか別な場所に接続はされます

ですので、接続許可が必要になります

ここで、許可しても先に進まないケースがあります

この場合はPower Automateの画面を開きましょう

そして以下の画像の「詳細」をクリックします

次に開く画面では「接続」が選択できます

ここで「新しい接続」をクリックします

次にエクセルを選択します

さらに、次に開いた画面でエクセルとの接続を作成します(アカウントとログインパスワードも聞かれます。基本的にはクリックしていくだけです)

さて、本題に戻りましょう

新しいテストセッションを再度開始しましょう

ここで商品を選択すると、エクセルへの書き込みが処理されます

うまいことエクセルの書き込みが成功したようです!

まとめ

今回の中級編では、「会話から実行へ」という Copilot Studio の本質に踏み込みながら、 外部サービスとやり取りするための最小構成として JSON → アクション実行 の流れを解説しました。

JSON は特別なものではなく、 「データを名前付きで整理して渡すための入れ物」 にすぎません。 しかし、この入れ物を理解すると、API との通信が一気にシンプルになります。

そして、外部連携を実現するうえで重要なのは、 “壊れない構成を選ぶこと” です。

  • エージェントフロー
  • Power Automate

これらは強力ですが、更新や接続の影響を受けやすく、 初心者〜中級者が最初に苦しむポイントでもあります。

だからこそ今回は、 トピック内で完結する Excel 行追加アクション を採用し、 Power Fx のレコード構文でシンプルにデータを書き込む方法を紹介しました。

この構成なら、

  • バインド破損が起きない
  • 接続エラーが少ない
  • 公開忘れがない
  • JSON の理解がそのまま実務に活きる

というメリットが得られます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です