コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

【Power Automate Tip's】アクションのパラメーターに設定すべき値がわからない場合は「コードのプレビュー」で確認しよう!

はじめに

Power Automateを作成していると、固定値ではなくトリガーやアクションで取得した動的な結果を利用したい場合がよくあるかと思います。

その際によく躓くポイントとして、SharePointやOneDriveのアクションを利用している際に、
「フォルダのパスって書いてあるから。フォルダのパスを設定してみたのにエラーになるんだけど!」
みたいなことがちょくちょくあるかと思います。

この記事ではそういった問題が発生した際の対処方法の一例を紹介しています。

コードのプレビューを確認しよう!

タイトルでも答えを記載していますが、「コードのプレビュー」を確認することでそのパラメーターに設定すべき値がどのような値なのか?をチェックすることができます。

「コードのプレビュー」では、そのアクションで設定されたパラメーターの値を確認することができます。

例えばこちらの「新しいフォルダーの作成」アクションを例にみていきましょう。

learn.microsoft.com

このアクションでは上記のように、「一覧またはライブラリ」を設定するパラメーターがありますね。
今回このパラメーターには「ドキュメント」を設定していますが、「コードのプレビュー」でみてみると以下のようになっています。

{
    "inputs": {
        "host": {
            "connectionName": "shared_sharepointonline",
            "operationId": "CreateNewFolder",
            "apiId": "/providers/Microsoft.PowerApps/apis/shared_sharepointonline"
        },
        "parameters": {
            "dataset": "https://korune.sharepoint.com/sites/development",
            "table": "8b565a2b-16aa-4e95-87f1-858123c325c9",
            "parameters/path": "TestFolder"
        },
        "authentication": {
            "type": "Raw",
            "value": "@json(decodeBase64(triggerOutputs().headers['X-MS-APIM-Tokens']))['$ConnectionKey']"
        }
    }
}

"parameters"内がアクション内で設定したパラメーターたちになるのですが「ドキュメント」の記載がありませんね。

ではどこで設定されているのか?というとドキュメントより確認することができます。

ちょっとName(日本語)が異なっていますが、説明より考えると「リストやライブラリ」が「一覧またはライブラリ」に該当します。

ここをみる「キー」が「table」となっていますね。

では戻って先ほどのコードビューの結果をみてみると「table」のプロパティがあるかと思います。

ここをみるとライブラリの名前ではなく、対象のライブラリのIDが設定されていますね。

つまり「一覧またはライブラリ」には「ライブラリ名」ではなく「ライブラリのID」を設定しなくてはならない。

ということになります。

おわりに

このようにして、対象のパラメーターにどの動的なコンテンツを設定しなくてはならないのか?がわからなくなった際は「コードのプレビュー」で確認するようにしましょう!

SharePointにあるファイルの名前および拡張子を変更する

はじめに

Power AutomateではSharePointコネクタを用いて多くの操作を標準アクションとしてSharePointに対して行うことができます。

しかし現時点(2023/10/21)では、SharePointのドキュメントフォルダにあるファイルのファイル名を変更することはできません。

learn.microsoft.com

そこでこの記事では、Power Automateを用いてファイル名やファイルの種類(拡張子)を変更する方法をいくつか紹介します。

今回テストで利用するファイル

今回は以下のような「Sample.csv」というファイルに対して操作を行っています。

ファイル名の更新ができそうでできないアクション

標準アクションではファイルのプロパティの更新というものがあり、これを利用すれば一見ファイルのプロパティを更新するわけですから、ファイル名の変更ができそうですが、これではファイル名の更新はできません。

更新できるのは

  • タイトル
  • 説明
  • 画像タグ

の3種類であり、タイトルがファイル名に当たるのではないか?と思われるかもしれませんが、ファイルのプロパティを見てもらえればわかる通りファイルの名前とタイトルは別のプロパティとして扱われています。

よって、「ファイルのプロパティの更新」アクションではファイル名の変更はできないので気を付けてください。

ファイル名を変更する

今回の説明ではトリガーには「手動でフローをトリガーします」を利用しています。

SharePoint REST APIを用いて変更する

フローの全体としては以下のようになっています。

まず、「パスによるファイル メタデータの取得」でファイルの情報を取得しています。

ここで欲しいのはファイルのIdである ItemId です。

Id ではなく、ItemId なのでご注意ください。

続いて、先ほど取得した ItemIdSharePoint REST APIを用いてファイルの情報を取得しています。

「先ほどもファイルの情報取得したのに?」と思われるかもですが、ここでは取得したい情報が異なります。
これにより欲しいのは、"SP.Data.Shared_x0020_DocumentsItem"というファイルのmetadataにあるtypeです。

これは「パスによるファイル メタデータの取得」では得られなかった結果です。

そして、SharePoint REST APIでファイル(アイテム)の情報を取得するためには ItemId が必要だったのでこのようなことを行っているわけですね。

learn.microsoft.com

設定項目ですが、以下のように設定しています。

方法

GET

URI

_api/web/GetListUsingPath(DecodedUrl='/sites/[Your Site]/[Your Documents library]')/items(@{outputs('パスによるファイル_メタデータの取得')?['body/ItemId']})

[Your Site]と[Your Documents library]の箇所はご自身のサイト名とドキュメントライブラリ名の内部名にそれぞれ置き換えてください。
URLより確認することができます。

他にもURIには以下のように記載することもできます。

URI

_api/web/lists/GetByTitle('[ドキュメントライブラリ名]')/items(@{outputs('パスによるファイル_メタデータの取得')?['body/ItemId']})

[ドキュメントライブラリ名]の箇所はこちらの場合は、表示名で指定することになります。

どちらでも取得される情報は同じですのでお好きな方法で。

内部名で指定したほうが、変更がされないのでフローが急に動かなくなったみたいなことは避けられるかな?

最後にこれまでのアクションで得られた情報を用いてファイル名の変更を行います。

方法

POST

URI

_api/web/GetListUsingPath(DecodedUrl='/sites/[Your Site]/[Your Documents library]')/items(@{outputs('パスによるファイル_メタデータの取得')?['body/ItemId']})

先ほどのGETでファイル情報を取得したときと同じURIでOK。

ヘッダー

{
    "Content-Type": "application/json;odata=verbose",
    "Accept": "application/json;odata=verbose",
    "If-Match": "*",
    "X-Http-Method": "MERGE"
}

ボディ

{
  "__metadata": {
    "type": "@{body('SharePoint_に_HTTP_要求を送信します(Get_File)')?['d']?['__metadata']?['type']}"
  },
  "FileLeafRef": "[変更したいファイル名].csv"
}

ボディにて先ほどGETで取得した情報が必要になってくるわけですね。

なおこの方法ではファイルの拡張子までは変更できませんのでご注意ください。

Graph APIを用いて変更する

ファイルの種類(拡張子)も変更したい場合はこちらを利用することになります。

フローの全体としては以下のようになっています。

アクションは変わらず「SharePoint に HTTP 要求を送信します」を利用します。

ただし今回実行したいのはSharePoint REST APIではなくGraph APIですので、以下公式ドキュメントのようにGraph APIを介したSharePoint REST APIの実行を行います。

learn.microsoft.com

まずは、DriveIdItemId が必要なので取得を行います。

ItemId は先ほどSharePoint REST APIで用いていた ItemId とは異なる値となりますのでお気をつけ下さい。

Graph APIでのファイル操作はこちらの公式ドキュメント、もしくは私がまとめているこちらのサイトが参考になるかな?と思います。

learn.microsoft.com

koruneko.hatenablog.com

DriveId は以下で取得します。

方法

GET

URI

_api/v2.1/drive

続いて ItemId は以下で取得を行います。

方法

GET

URI

_api/v2.1/drives/@{body('SharePoint_に_HTTP_要求を送信します(Get_DriveId)')?['id']}/items/root:/[Your Folder Path]:/children?$filter=name eq '[Your File Name].[Your File Extension]'&$select=name,id

[Your Folder Path]には対象のファイルがあるフォルダのパスに変更してください。
例えば今回ですと以下のようになりますね。

root:/General/TestFile:/children

?$filter では得られる結果を絞っています。

[Your File Name].[Your File Extension]ではファイル名を変更したいファイルの拡張子付きのファイル名を設定してください。

ちなみにDriveIdItemId は「ファイルのプロパティの取得」アクションの{Thumbnail}に設定されているURLの値を分解すればそれぞれ取得することもできますが、面倒なのでAPI使ってそれぞれ取得したほうが良いと思います。

最後にこれまでのアクションで得られた情報を用いてファイル名の変更を行います。

方法

PATCH

URI

_api/v2.1/drives/@{body('SharePoint_に_HTTP_要求を送信します(Get_DriveId)')?['id']}/items/@{body('SharePoint_に_HTTP_要求を送信します(Get_ItemId)')?['value']?[0]?['id']}

ヘッダー

{
    "Content-Type": "application/json"
}

ボディ

{
    "name": "[変更したいファイル名].[変更したいファイルの拡張子]"
}

この方法ですと、拡張子(ファイルの種類)を変更することも可能です。

おわりに

APIを直で叩くことによりファイル名の変更を行うことが可能です。

ただし、拡張子(ファイルの種類)を変更したい場合はGraph APIを実行する必要があるのでお気を付けください。

ファイル名の変更はよく行われる操作だと思いますので、標準アクションとしてファイル名の変更ができるようになるといいですねー

SharePointリストのソート順を変更する

はじめに

以前Power Appsでアイテムの順番を変更する方法をこちらで紹介しました。

koruneko.hatenablog.com

今回はこちらの質問にある通り、リストのアイテムの順番を変更するやり方を紹介しようと思います。

...回答が遅くなってしまい申し訳ないです。。。

アイテムの順番を変更する

こちらのやり方をもとに紹介します。

リストはこんなデータを用意しました。

Power Appsでは前回と同じようにこのような表示ですね。

Gallery.Items

ChangeSortItems

DropDown.Items

ChangeSortItems.Number

DropDown.Default

ThisItem.Number

DropDown.Default

With(
    {
        oldIndex: ThisItem.Number,
        newIndex: Self.Selected.Number,
        selectedItemId: ThisItem.ID
    },
    UpdateIf(ChangeSortItems, ID = selectedItemId, {Number: newIndex});
    If(
        oldIndex < newIndex,
        UpdateIf(ChangeSortItems, ID <> selectedItemId && Number > oldIndex && Number <= newIndex, {Number: Number - 1}),
        UpdateIf(ChangeSortItems, ID <> selectedItemId && Number < oldIndex && Number >= newIndex, {Number: Number + 1})
    );
)

更新するとこうなりますね。

UpdateIfはSharePointリストに対して委任ができるようになっている(はず!!ここの検証はちょっと甘いです。)のでPatchをForAllで回したりせずに実施しました。

learn.microsoft.com

おわりに

回答が遅くなってしまい本当に申し訳ありませんでしたーーーーーー

【2023/09/25Ver】Power AutomateからGraph APIを実行する方法と一覧

はじめに

8月のはじめあたりに、とうとうOffice 365 Groupsの「HTTP 要求を送信します」が削除され、後続の「HTTP 要求 V2 を送信する」のみが利用可能になりました。

これによって何が困るかといいますと、Power AutomateでのGraph API実行が制限されるようになりました。

こちらの公式ドキュメントにある通り、「HTTP 要求 V2 を送信する」では"/groups"セグメントしかサポートされていません。
それ以外のセグメントを指定してこちらのアクションでGraph APIを実行しようとするとエラーになります。

learn.microsoft.com

前まで利用可能であった「HTTP 要求を送信します」アクションはこのセグメント制限がなかったので、多くの方はこちらのアクションを利用してPower AutomateからGraph APIを実行していたかと思います。
* 正しくいうと「HTTP 要求を送信します」ですべてのGraph APIが実行できたわけではないですが

一応旧「HTTP 要求を送信します」を利用したい方向けに「HTTP 要求を送信します」のアクションを追加可能なJSON値を置いておきます。
これをコピーしてPower Automateで貼り付けて利用してください。
詳しいやり方はこちらの記事下部にあるGifを参照してください。

koruneko.hatenablog.com

ただしこのアクションの利用は既に非推奨となっていることにご注意ください。
もう一度いいますが、このアクションの利用は現在は非推奨です。

利用の際はその点ご留意の上自己責任でお願いします。

{"id":"022189c7-e71e-4b88-9e7e-b8cbf46bc368","brandColor":"#EB3C00","connectionReferences":{"shared_office365groups_1":{"connection":{"id":"/providers/Microsoft.PowerApps/apis/shared_office365groups/connections/shared-office365grou-6b56f974-29a6-4a98-93ff-092b9de4116e"}},"shared_office365groups":{"connection":{"id":"/new_sharedoffice365groups_149bb"}}},"connectorDisplayName":"Office 365 グループ","icon":"https://connectoricons-prod.azureedge.net/releases/v1.0.1654/1.0.1654.3410/office365groups/icon.png","isTrigger":false,"operationName":"HTTP_要求を送信します","operationDefinition":{"type":"OpenApiConnection","inputs":{"host":{"connectionName":"shared_office365groups_1","operationId":"HttpRequest","apiId":"/providers/Microsoft.PowerApps/apis/shared_office365groups"},"parameters":{"Uri":"","Method":"","ContentType":"application/json"},"authentication":{"type":"Raw","value":"@json(decodeBase64(triggerOutputs().headers['X-MS-APIM-Tokens']))['$ConnectionKey']"}},"runAfter":{},"metadata":{"operationMetadataId":"16b6956c-8454-426e-8564-426e46fdde45"}}}

さて、今回は現時点でPower Automateから利用可能なGraph APIを実行可能なアクション一覧とそれで利用可能なGraph APIの例を紹介しようと思います。

標準コネクタで実行可能なアクション

Office 365 Users

こちらのアクションですね。

ドキュメントはこちら。

learn.microsoft.com

こちらにはUser情報に関するGraph APIを実行可能です。

Microsoft Graph REST API リクエストを作成し呼び出します。 次のセグメントがサポートされています: 第 1 セグメント: /me、/users/ 第 2 セグメント: messages、mailFolders、events、calendar、calendars、outlook、inferenceClassification。

第一セグメントとか第にセグメントといわれてもピンとこないかもしれませんが、

https://graph.microsoft.com/v1.0/me/messages

というURIがあった場合、

第一セグメント

me

第二セグメント

messages

となります。
つまり、

https://graph.microsoft.com/v1.0/

以降の"/"区切りの要素がセグメントといわれているわけですね。

余談ですが、"beta"でもOKです。

https://graph.microsoft.com/beta/

さて、利用可能なセグメントですがドキュメントでは

第一セグメント

  • me
  • users

第二セグメント

  • messages
  • mailFolders
  • events
  • calendar
  • calendars
  • outlook
  • inferenceClassification

となっています。

ここで注意が必要な点が、このアクションを用いてこれらのAPIを実施する際、第一セグメントと第二セグメントの両方の要素が指定されている必要があるということです。

例えば自分自身の情報を取得する、

https://graph.microsoft.com/v1.0/me

を実行すると以下のようなエラーが発生します。

URI path is not a valid Graph endpoint, path is neither absolute nor relative or resource/object is not supported for this connector. Resources: me,users Objects: messages,mailFolders,events,calendar,calendars,outlook,inferenceClassification. Uri: https://graph.microsoft.com/v1.0/me

この形式はサポートされていないということですね。

また、以下のような特定のUser Idを指定して実行した場合も失敗します。

https://graph.microsoft.com/v1.0/users/{user-id}

第一セグメント + 第二セグメントの指定が必須ということを覚えておきましょう。

それでは実行可能なGraph APIの例ですが以下のようなものが実行可能です。
(例で記載しているだけですべてを網羅しているわけではないです。)

自分自身の情報

https://graph.microsoft.com/v1.0/me/messages
https://graph.microsoft.com/v1.0/me/mailFolders

他ユーザの情報

https://graph.microsoft.com/v1.0/users/{user-id}/outlook
https://graph.microsoft.com/v1.0/users/{user-id}/events

* こちらはそのユーザの情報にアクセス可能な権限を設定する必要があります。

他にもこのようなAPIも実行することが可能です。

https://graph.microsoft.com/v1.0/me/messages/{message-id}

またもちろんGETだけでなくPOSTも実行することが可能です。

Office 365 Outlook

こちらのアクションですね。

ドキュメントはこちら。

learn.microsoft.com

Microsoft Graph REST API リクエストを作成し呼び出します。 次のセグメントがサポートされています: 第 1 セグメント: /me、/users/ 第 2 セグメント: messages、mailFolders、events、calendar、calendars、outlook、inferenceClassification。

Office 365 Usersと同じですね。

実行可能な要素がOutlookのアクションで取得可能な情報ですので、わかりやすくフローを作成するのであれば、こちらのアクションを利用したほうがいいのかな?

Office 365 Groups

こちらのアクションですね。

ドキュメントはこちら。

learn.microsoft.com

Microsoft Graph REST API リクエストを作成し呼び出します。 サポートされているセグメントが 1 つあります: /groups。

グループの情報を取得可能です。

こちらが基本形ですね。

https://graph.microsoft.com/v1.0/groups

Microsoft 365 グループ (別名統合グループ) のみを一覧表示するようなクエリパラメータを付与して実行することも可能です。

https://graph.microsoft.com/v1.0/groups?$filter=groupTypes/any(c:c+eq+'Unified')

また、特定のグループのメンバーを表示するようなAPIも実行可能です。

https://graph.microsoft.com/v1.0/groups/{group-id}/members

Office 365 Group Mail

こちらのアクションですね。

ドキュメントはこちら。

learn.microsoft.com

Microsoft Graph REST API リクエストを作成し呼び出します。

セグメントの指定書いてないが!?

適当なGraph APIを実行してみると以下のようなエラーメッセージを確認することができます。

URI path is not a valid Graph endpoint, path is neither absolute nor relative or resource/object is not supported for this connector. Resources: groups Objects: messages,mailFolders,events,calendar,calendars,outlook,inferenceClassification. Uri: https://graph.microsoft.com/v1.0/me

どうやらOffice 365 Groupsよりもより厳しい制限での実行のようですね。

以下のようなグループ情報を取得するAPIを実行すると

https://graph.microsoft.com/v1.0/groups

以下のようにエラーになります。

URI path is not a valid Graph endpoint, path is neither absolute nor relative or resource/object is not supported for this connector. Resources: groups Objects: messages,mailFolders,events,calendar,calendars,outlook,inferenceClassification. Uri: https://graph.microsoft.com/v1.0/groups

以下のようなAPIが実行可能ですね。

https://graph.microsoft.com/v1.0/groups/{group-id}/calendar

以下のリソースは"/groups"では実施できないと思うのだが、どうやって実行するのだろうか。。。

  • messages
  • mailFolders
  • calendar
  • outlook
  • inferenceClassification

このアクションをわざわざ利用するケースはよくわからないなー。。。
Office 365 Groupsでよくないかな?

SharePoint

こちらは厳密にはGraph APIを実行するためのアクションではないのですが、一応紹介

こちらのアクションですね。

ドキュメントはこちら。

learn.microsoft.com

呼び出す SharePoint REST API を作成します。 注意 – このアクションでは、アクセスできるいずれの SharePoint REST API を実行します。 この機能を使うときは注意してください。

こちらのアクションはSharePoint REST APIを実行するためのアクションです。

learn.microsoft.com

以下のような形式ですね。

_api/site/

SharePoint REST APIの形式でGraph APIも実行することができます。

learn.microsoft.com

ドキュメントですと、"v2.0"と記載されていますが、少なくともPower Automateから実行する場合は"v2.1"かな?

以下のような形式ですね。

_api/v2.1/sites/root

プレミアムコネクタで実行可能なアクション

HTTP with Azure AD

こちらのアクションですね。

ドキュメントはこちら。

learn.microsoft.com

こちらのアクションであれば、このアクションを実行するユーザの権限に従ってGraph APIを実行可能です。

Graph APIを自由に実行したい場合はこちらのアクションを利用、つまりプレミアムコネクタを利用することになります。

HTTP

こちらのアクションですね。

こちらのアクションは組み込みアクションなのでドキュメントはないです(ないはず)。

こちらのコネクタは接続情報を持たないので、認証情報を作成してあげる必要があります。

認証情報の作成はこちらが参考になるかな?

koruneko.hatenablog.com

おわりに

公式ドキュメントに記載の以下リンク、軒並み死んでますね。

詳細情報: https://docs.microsoft.com/en-us/graph/use-the-api

正しくはこっち

https://learn.microsoft.com/en-us/graph/use-the-api

"。"までリンク扱いしちゃってますね。。。

漏れなどありましたらコメントお願いしますー

Power Appsでアイテムの順番を変更する

はじめに

Power Appsでアイテム(コレクション)の表示順を変更する方法をまとめています。

こんな感じのドロップダウンで、ソート順を変更するイメージです。

ドラッグ & ドロップでいい感じに順番を変更する方法は紹介していないのでご留意ください。

今回サンプルで用意したコレクション

紹介を行うにあたり用意したコレクションは以下です。

ClearCollect(
    col,
    ForAll(
        Sequence(10),
        {
            _guid: GUID(),
            Index: ThisRecord.Value,
            num: ThisRecord.Value,
            char: Char(ThisRecord.Value + 64)
        }
    )
)
フィールド名 役割
_guid 行を一意に特定するためのフィールドです
Index コレクションの並び順を特定するためのフィールドです
その他 行の値です(numやchar)
ここはなんでもOK

並び順を変更するにはなにをする必要がある?

例えば1~5の数字があったとして、"3"を一番上に持ってくるとします。

その場合、順番が変更になるのは"1"、"2"、"3"の3つですね。

このように順番を変更するためには、変更を行う自分自身及びそれに関連する他のアイテムまで変更が必要になってきます。

そのことを意識したうえで実装を行っていきましょう。

なお、この後で紹介する式はすべてDropDownのOnChangeに記載しています。

[やり方その1]変更後の間に設定する

まず1つ目のやり方は、変更後の間にアイテムを設定するやり方です。

例えば並び順が1番目のアイテムを3番目に変更する場合、並び順が3番目と4番目の間に設定してあげればよいです。

つまり、3番目と4番目のIndex値の半分の値を設定してあげればいいですね。

続いて並び順が5番目のアイテムを2番目に変更する場合をみてみましょう。
この場合は、1番目と2番目の間に設定する必要がありますね。

このようにアイテムを上にもってくるのか下にもってくるのかによって、挿入する箇所が異なってくる。というのがこのやり方の場合の注意点です。

注意点は他にもあります。

それはアイテムを最初、もしくは最後に順番を変更する場合ですね。

最初に挿入する場合は最初の前のアイテムが、最後に挿入する場合は最後の次のアイテムが存在しません。
よって、"間に挿入する"という計算を行う際は仮の値を設定して計算する必要がでてきます。

これらの点に注意して式を設定すると以下のようになります。

UpdateIf(
    col, 
    _guid = ThisItem._guid, 
    {
        Index: 
            (
                Index(Sort(col, Index), Self.Selected.Value).Index + 
                Switch(
                    Self.Selected.Value,
                    1, 0,
                    CountRows(col), CountRows(col) + 1,
                    Index(Sort(col, Index), Self.Selected.Value + (Self.Selected.Value - ThisItem.Index) / Abs(Self.Selected.Value - ThisItem.Index)).Index
                )
            ) / 2
    }
);

1つめのアイテムを上にもってくるのか下にもってくるのかの判断は下のような式によって解決しています。

(Self.Selected.Value - ThisItem.Index) / Abs(Self.Selected.Value - ThisItem.Index)

上記式だと、上に持ってくる場合は"+1"が設定され、下に持ってくる場合は"-1"が設定されることになりますね。

2つめの最初と最後の条件はSwitch関数を使うことで解決しています。

最後に、Indexが小数で表されているとどこかで浮動小数点による計算誤差が発生する恐れがあるので整数に戻してあげます。

ForAll(
    Sort(col, Index) As tmpItems,
    UpdateIf(col, _guid = tmpItems._guid, {Index: CountIf(col, Index <= tmpItems.Index)})
)

一応これらをまとめた式の全体はこちらになります。

UpdateIf(
    col, 
    _guid = ThisItem._guid, 
    {
        Index: 
            (
                Index(Sort(col, Index), Self.Selected.Value).Index + 
                Switch(
                    Self.Selected.Value,
                    1, 0,
                    CountRows(col), CountRows(col) + 1,
                    Index(Sort(col, Index), Self.Selected.Value + (Self.Selected.Value - ThisItem.Index) / Abs(Self.Selected.Value - ThisItem.Index)).Index
                )
            ) / 2
    }
);
ForAll(
    Sort(col, Index) As tmpItems,
    UpdateIf(col, _guid = tmpItems._guid, {Index: CountIf(col, Index <= tmpItems.Index)})
)

考慮事項もそこそこあったので、あまりシンプルな式ではないですね。。。

[やり方その2]変更前のIndex値と変更後のIndex値を保持して並び替える

こちらの方法の方がシンプルで直感的だと思いますので、私はこちらの方法をおすすめします。

順番を入れ替える操作を行う場合、以下のような手順を行えば順番を入れ替えることができるかと思います。

  1. 対象のアイテムを入れ替え先のIndex値に設定する
  2. 対象のアイテムが下に移動する場合は、関連するアイテムのIndex値を1つ下げる
    対象のアイテムが上に移動する場合は、関連するアイテムのIndex値を1つ上げる

2つめの手順を実施する際は、1つめの手順で対象になったアイテムは除外してあげる必要がありますね。

このことに注意して式に起こすと以下のようになります。

With(
    {
        oldIndex: ThisItem.Index,
        newIndex: Self.Selected.Value,
        selectedItemId: ThisItem._guid
    },
    UpdateIf(col, _guid = selectedItemId, {Index: newIndex});
    If(
        oldIndex < newIndex,
        UpdateIf(col, _guid <> selectedItemId && Index > oldIndex && Index <= newIndex, {Index: Index - 1}),
        UpdateIf(col, _guid <> selectedItemId && Index < oldIndex && Index >= newIndex, {Index: Index + 1})
    );
)

式もシンプルでわかりやすいものになっているかと思います!

おわりに

並び順を変更したいなーというケースはよくあるかと思いますので、参考にしていただけると幸いです。  

不明点などあればコメントなどお気軽にどうぞー

Power AutomateでSharePointやOneDriveのフォルダの色を変更する

はじめに

OneDrive for BusinessやSharePointでフォルダの色を変更することができる機能が2023年8月中旬あたりに展開されました。

更新プログラムのロードマップ | Microsoft 365

今回はこのフォルダの色の変更をPower Automate経由で行う方法をまとめたいと思います。

フォルダの色を変更する

フォルダの色を変更するアクションは標準コネクタでは展開されていないので、「SharePoint に HTTP 要求を送信します」アクションにより、SharePoint REST APIを実行することで実現しようと思います。

フォルダの色変更は以下のAPIで行うことができます。

Method

POST

URI

_api/foldercoloring/stampcolor(DecodedUrl='[デコードされたフォルダのUrl]')

Header

{
    "Accept": "application/json;odata=verbose",
    "Content-Type": "application/json;odata=verbose"
}

Body

{
  "coloringInformation": {
    "__metadata": {
      "type": "SP.FolderColoringInformation"
    },
    "ColorHex": "[設定したい色]"
  }
}

実際に設定するとこんな感じです。

フォルダのURIを取得するために「フォルダー メタデータの取得」を行っています。

"/Shared Documents/General/テストフォルダ"みたいなのが欲しいだけなので、別に直打ちでもOKです。

ここで設定したい文字列はエンコードされた文字列なのでuriComponent 関数を用いてエンコードしてあげます。

ただし注意点としてここに設定するUrlはデコードされると以下のような形式である必要があります。

/sites/development/Shared Documents/General/テストフォルダ

「フォルダー メタデータの取得」アクションでは、"/sites/[サイト名]"の箇所が取得できないですね。

なのでこの方法で行う場合は、サイト名を取得するアクションを別で用意してあげるか予め設定しておいてあげます。

今回はサイトは固定で予め設定しておいてあげます。

設定している実際の式は以下のようになっています。

URI

_api/foldercoloring/stampcolor(DecodedUrl=@a1)?@a1='%2Fsites%2Fdevelopment@{uriComponent(outputs('フォルダー_メタデータの取得')?['body/Path'])}'

あとはBodyにて設定したい色を設定してあげます。

色ですが、以下のように定義されているようです。(左上から順にまとめています。)

色のサンプル ColorHex
0
8
1
9
2
10
3
11
4
12
5
13
6
14
7
15

例えば右下のような薄ピンク色に設定したい場合はColorHexは15ですので以下のように設定します。

Body

{
  "coloringInformation": {
    "__metadata": {
      "type": "SP.FolderColoringInformation"
    },
    "ColorHex": "15"
  }
}

色の設定方法がちょっとわかりにくいかもですねー

[おまけ]APIの調べ方

私がAPIを調べる際は以下のようにしています。

  1. 公式ドキュメントを確認
    例) Microsoft GraphSharePoint REST API
  2. 個人ブログなどで紹介してくれている人がいないか調べる
  3. ディベロッパーツールでリクエストを確認する

1, 2は調べていただければ解決するので今回は3のやり方を簡単に紹介しておこうと思います。
* 利用しているブラウザはChromeですが、おおよそ他のブラウザでも同じはずです。

まずは「F12」や「Ctrl + Shift + I」を押してみてください。
するとDev Toolsが画面右側に現れるかと思います。

私は右側にドッキングされている形式は見ずらいので、以下のように別タブで表示するようにしています。

また、調べてもらえれば日本語化するやり方もありますので日本語で見たい方はそちらの設定も行ってください。

リクエストを確認するには"Network"タブを確認します。

続いてDev Toolsを開いた状態で確認したいリクエストの操作を実際の画面で行ってみてください。

すると以下のようにリクエスト内容が記録されていきます。

(もし、確認したいリクエストの操作をする前からこちらのログに様々なリクエストが表示されている場合は、「Ctrl + L」を押してリセットするか、左上にあるClear network logより履歴のリセットを行ってください。 )

こちらのログで表示されているリクエストの1つを選択すると、そのリクエストの詳細を確認することができます。

色々ありますが、HeadersがリクエストされたHeader情報、Payloadにはリクエスト時に送られたBodyの情報が、そしてPreviewではリクエストの結果を確認することができます。

他にも項目がありますがここではざっくりこの程度で。
他の項目の情報も知りたい方は是非調べてみてください。

リクエストを1つずつ確認して目当てのリクエストを探すのでもよいのですが、「Ctrl + F」を押すことで検索を行うこともできます。

もし特定のキーワードがわかっている場合などはこちらを使うといいかもです。

また、左上の検索窓ではdomainやmethodなどの要素でフィルタすることも可能ですので、こちらも是非活用してみてください。

おわりに

ドキュメントの種類ごとに色分けしておくとぱっと見でなんのフォルダかわかりやすくなっていいかもですね!

【JPPGB #8】ボールを射法投射してみよう

はじめに

JPPGB #8のLT枠でお話したPower Appsでの射法投射の実装方法についてまとめています。

jppgb.connpass.com

こちらを参考に皆さんも是非Power Appsでのゲーム開発に挑戦してみてください!

射法投射

一覧

利用するコントロールと変数の一覧をまとめています。
上手く動かない場合など、作成漏れがないか。や各コントロールや変数の役割を確認したい際に確認してみてください。

利用するコントロール一覧

今回利用するコントロールはこちらです。

コントロール 役割
VelocityLbl 初速度を表示するラベル
VelocitySlider 初速度を設定するスライダー
AngleLbl 発射角を表示するラベル
AngleSlider 発射角を設定するスライダー
Circle 設定値に従って投げられるボール
ShotBtn ボールを投げるボタン
isGrandTgl ボールが地面に到達したら処理を止めるためのトグル
LoopTgl ボールの座標を計算するためのトグル
isLoopTgl デバッグ用の処理を緊急停止するためのトグル
IniBtn 初期化ボタン

利用する変数一覧

今回利用する変数はこちらです。

変数名 役割
acc 重力加速度
地球上では  9.81{m/s}^2 が重力加速度となるので、
初期値には9.81を設定しています
angle ボールを射法投射する角度
Degreeで表しています
time 射法投射を開始した時間経過
iniVelocity ボールを射法投射するときの初速度
circleX ボールのX座標の値
circleY ボールのY座標の値
loopFlg ボールを射法投射処理するためのフラグ

ボールを用意する

まずは射法投射するためのボールを用意しましょう。

図形より円(Circle)を追加します。
コントロール名は "Circle" とします。

ボールの初期位置は左下に設定したいです。

なので、初期化用ボタン("IniBtn")を追加して、ボタンが選択されたときに変数が初期化されるようにします。

IniBtn.OnSelect

UpdateContext({circleX: 0, circleY: App.Height - Circle.Height});

ボールの座標にはこれらを適用したいので、それぞれ設定しましょう。

Circle.X

circleX

Circle.Y

circleY

私のブログをちょくちょく見てくれている方は、何度も聞いていることかもしれませんがこのように初期化用ボタンを用意しておくと、開発時に大変便利なのでおすすめです。

この初期化処理は画面表示時に実行したいので以下のような式も追加しておくといいかもです。

Screen1.OnVisible

Select(IniBtn)

射法投射に必要なパラメータと計算方法

射法投射を計算するためには以下のパラメータが必要になってきます。

  1. 初速度 (initial velocity,  v_0):
    ボールが放たれた瞬間の速度です。
  2. 射角 (launch angle,  θ):
    ボールの放物線の最高点からの角度です。
  3. 重力加速度 (acceleration due to gravity,  g):
    通常、地球では約  9.81{m/s}^2 です。

これらのパラメータを用いて、ボールの水平方向の位置 ( x) および垂直方向の位置 ( y) 、時間 ( t) とすると、以下のように表すことができます。

  • 水平方向の位置 ( x)
     x = v_0 \times \cos \theta \times t
  • 垂直方向の位置 ( y)
     y = v_0 \times\sin \theta \times t - \frac{1}{2} g t^{2}

式を見てもらえばわかりますが、今回は空気抵抗などは考慮していないです。

射法投射に必要なパラメータを用意する

先ほど説明したパラメータを用意します。

まずは初期値として用意する必要があるので以下のように初期化ボタンの設定に以下式を追記します。

IniBtn.OnSelect

// 初期値
UpdateContext(
    {
        time: 0,
        iniVelocity: 100,
        angle: 45,
        acc: 9.81
    }
);

timeが時間( t)
iniVelocityが初速度( v_0)
angleが射角( θ)
accが重力加速度( g)
ですね。

初速度( v_0)と射角( θ)は都度変更できるようにしたいです。
よって、それぞれの値を表示するためのラベルと値を変更するためのスライダーを用意します。

初速度用

VelocityLbl.Text

$"初速度: {iniVelocity}"

VelocitySlider.OnChange

UpdateContext({iniVelocity: Self.Value})

射角用

AngleLbl.Text

$"角度: {angle}"

AngleSlider.OnChange

UpdateContext({angle: Self.Value})

射法投射によるボールの座標を計算する

射法投射によるボールの座標を計算するためには、時間経過ごとに座標を再計算するような繰り返し処理(ループ処理)が必要になってきます。

Power Appsでループ処理というとタイマーコントロールを用いたものやスライダーコントロールを用いたものがありますが、今回は折角ですので私がこの前紹介したトグルコントールを用いたループ処理、トグループを利用したいと思います。

トグループの詳しいやり方についてはこちらの記事をご参照ください。

koruneko.hatenablog.com

トグルによるループ処理を行うので、トグルコントロールを追加します。
こちらの名前は "LoopTgl" としてください。

またループ処理の設定がミスったとき用にループ処理を緊急停止できるようのトグル、"isLoopTgl"も追加しておいてください。

ループ処理を開始するかを判定するためのフラグが欲しいので、変数で用意してあげます。
また、ループ用のトグルコントロールは初期化時にリセットしておいてあげましょう。

初期化ボタンの設定に以下式を追記します。

Reset(isLoopTgl);

// ループフラグ
UpdateContext({loopFlg: false})

ループ処理が行われる仕組みを設定します。

ループ用トグル("LoopTgl")に以下を設定します。

LoopTgl.Default

loopFlg && isLoopTgl.Value

LoopTgl.OnChange

UpdateContext({loopFlg: !loopFlg})

トグルのチェック状態を切り替えることによりループ処理を実現する感じですね。

ループ処理緊急停止用のトグルの状態が変わったときにはループ処理用のトグルの状態をリセットする用にします。

isLoopTgl.OnChange

Reset(LoopTgl)

これでループの仕組みが完了したのでボールの座標を計算する処理を設定していきます。

ループ用トグルがチェックされたとき(OnCheck)にボールの座標を計算するようにします。

LoopTgl.OnCheck

UpdateContext(
    {
        circleX: iniVelocity * Cos(Radians(angle)) * time,
        circleY: (App.Height - Circle.Height) - (iniVelocity * Sin(Radians(angle)) * time - 0.5 * acc * Power(time, 2))
    }
)

Power Appsの三角関数はDegreeではなくRadianで扱われるのでRadians関数でDegreeからRadianに変換を行っています。

learn.microsoft.com

また、Power AppsではY座標の値が小さくなるほど画面上部にいき、値が大きくなるほど画面下部になりますので、ボールの初期値から射法投射で計算された値を減算するようにしています。

ループ用トグルがチェックが外れたとき(OnUnCheck)に射法投射後の時間を経過されるようにします。

UpdateContext({time: time + 0.2});

時間は0.2ずつ加算されるようにしています。

ここで加算される数値が大きいほどボールは早く動きます。
ご自身でいい感じに設定してください。

また、このままでは射法投射後ずっとボールの座標が計算され続けてしまいます。
今回はとりあえずボールが半分画面下部に埋まったところでループ処理を止めるようしたいと思います。

ボールが画面下部に埋まったことを判断する仕組みとしてトグルコントロールを用意します。
名前は"isGrandTgl"とます。

こちらのDefaultに以下式を設定します。

isGrandTgl.Default

circleY <= App.Height - Circle.Height / 2

これにより、ボールが画面下部に半分埋まっているときはトグルのチェックが外れ(false)、それ以外の場合はトグルがチェック(true)になるようになります。

これをループ処理のトグルに組み込みます。(式を上書きしてください。)

LoopTgl.Default

loopFlg && isLoopTgl.Value && isGrandTgl.Value

ボールを射法投射する

最後にボタンが押されたら射法投射されるようにします。

"ShotBtn"という名前のボタンを追加して、以下のように設定します。

ShotBtn.OnSelect

UpdateContext({loopFlg: true});
Reset(LoopTgl)

これでボール("Circle")が射法投射されるようになりました!

おわりに

Power Appsでもゲーム(動くもの)を作成しようとすると、数学や物理の知識がちょっとだけ必要になってくる場面があります。

学生時代を思い出してみて、Power Appsで利用可能なコントロールや式を用いて皆さんもPower Appsでのゲーム開発に是非挑戦してみましょう!

そしてゲーム開発に挑戦してみた暁には是非JPPGBでの登壇をお願いします!
初心者の方も大歓迎です!!

JPPGB登壇に興味のある方は@koruneko32767までお願いしますー

Power Appsでトグループを設定してみよう

はじめに

Power Appsでループ処理というと、

  • タイマーを用いたループ処理
  • スライダーを用いたループ処理

の2つがよく利用されています。

* 厳密にいうとForAll 関数もありますが、こちらは上記のWhile系ループとはことなりFor-Each系ループなので省略しています。

今回これらに加えてさらにもう一つのやり方、トグルでのループ方法を紹介したいと思います!

記事のタイトルはタイポじゃないよ!
語呂がよかったの!!

こんな感じー

トグルでループ処理を実現する

トグルコントロール(切り替えコントロール)を利用することでもループ処理を行ってみます。

ざっくりやり方としては

  1. トグルのDefaultに設定するフラグを作成
  2. トグルが変更されたら(OnChange)"1"で作成したフラグを反転させる
  3. OnCheckOnUncheck、またはOnChangeでループ処理を設定

みたいな感じで、トグルのオン/オフを切り替えることで実現できます。

細かい設定方法をみていきましょう。

ループに必要なコントロールと変数を用意する

まずはトグルを用いたループに必要なコントロールや変数を用意します。

ループを行うための要素

ループを行うためには以下要素は必要です。

  1. ループを行うためのトグルコントロール
  2. 1で用意したトグルのオン/オフを切り替えるための変数

2はtrue/falseを切り替えることで実現可能なので以下のような変数を用意します。

UpdateContext({toggleFlg: false});

ループを開始/緊急停止するための要素

ループを開始するために、トグルのオン/オフを切り替えるための変数(toggleFlg)をtrueにするための処理が必要です。

これはボタンなどで実現できますね。

Button.OnSelect

UpdateContext({toggleFlg: true})

上で紹介しているGifでは右下のループ開始用トグルをオンにすることでtrueにしています。

isLoopTgl.OnCheck

UpdateContext({toggleFlg: true})

また、開発中は予期せぬ無限ループを防ぐためにセーフティ機能として、ループ緊急停止機能が欲しいです。

これを実現するには、

  • ループ緊急停止用のフラグを用意する
  • ループ緊急停止用のトグルを用意する

の2つがあります。
Gifでは後者で対応しています。

よってループ用のトグルのDefaultには以下のような式を設定しています。

LoopTgl.Default

toggleFlg && isLoopTgl.Value

上記の式では"isLoopTgl.Value"で緊急停止機能を実現していますので、トグルではなく変数で対応される方はこちらを変更してください。

ループさせる仕組み

ループを行うためには、ループ用のトグルをオンにしたりオフにしたりすればよいです。
よって、トグルが変更されたらトグルのDefaultに設定されているフラグの値を切り替えてあげましょう。

LoopTgl.OnChange

UpdateContext({toggleFlg: !toggleFlg})

ループ条件を別で設定したい場合はループ用のトグルのDefaultに条件を追加してあげます。

例えばループの実行条件として変数numが100以下であること。という条件を加えたい場合は以下のようになりますね。

LoopTgl.Default

toggleFlg && isLoopTgl.Value && num <= 100

これでループ処理が実現できます!

ループ処理を記載する

ループ処理はOnCheckOnUncheckで実現します。
もちろんOnChangeに記載してもらっても大丈夫です。

OnCheckOnUncheckで記載するメリットとしては以下ですかね。

  • ループの仕組み用の処理とループ内で実行したい処理を分けることができる
  • ループ内の処理の種類によって記載場所を分けられる(可読性向上)
    (トグルのオン/オフの切り替えは高速なのでそんなに気にならないはず)

まぁ、めんどくさければOnChengeに記載するのでも処理自体は変わらないので、好みによって使い分けてください。

おわりに

トグルでループ処理を行うメリットとしては、

  • タイマーよりも高速(滑らか)なループを実現できる
  • ループに必要な処理とループ内の処理を分離できる(可読性向上)

かな?と思います。

ま、こういう方法もあるんだな!ということを知っていただければ幸いです。

凄くざっくり書いちゃったのでよくわからない点などあればコメントお願いしますー

Power Automateでファイルの要求リンクを作成する

はじめに

OneDrive や SharePoint にはファイルの要求機能という、フォルダの共有リンクを作成するのではなく対象者にファイルをアップロードしてもらうためのファイル要求リンクを作成することができます。

support.microsoft.com

こちらの機能を有効にするにはこちらをご覧ください。

learn.microsoft.com

この機能の利点は、共有されたユーザはフォルダに直接アクセスできるわけではないので、フォルダーの内容を表示したり、ファイルを編集、削除、またはダウンロードしたり、他のユーザがファイルをアップロードしたかを確認することもできません。

これのリンクをPower Automateを用いて作成したかったのですが、標準アクションではできなかったので「SharePoint に HTTP 要求を送信します」アクションで実現してみました。

この記事ではそのやり方をまとめています。

やり方

今回はOneDriveにあるフォルダに対してファイルの要求リンクを作成していますが、どのサイトを対象にするか?が変わってくるだけですのでSharePointでもできると思います。

フォルダのIDを取得する

ファイルの要求リンクを作成したいフォルダのIDを取得します。

これは「パスによるフォルダー メタデータの取得」アクションで取得できますね。

取得したいフォルダが存在するサイトのアドレスとフォルダーのパスを選択 or 入力するだけですので割愛。

SharePoint REST APIによりファイルの要求リンクを取得する

ファイルの要求リンクは \ShareLink により取得することが可能です。
このリクエストは共有リンクを作成する際に利用するものですね。

このリクエストを送信する際にどのような種別のリンクを作成するか指定することで、作成するリンクの種別を切り替えることができます。

そのプロパティは linkKind ですね。

どのような値を設定すればどのような種別になるのかについては、以下ドキュメントをご確認ください。

linkKind Value
AnonymousEdit 5
AnonymousView 4
Direct 1
Flexible 6
OrganizationEdit 3
OrganizationView 2
Uninitialized 0

learn.microsoft.com

ファイルの要求リンクを作成する際は "6" ですね。

さて、これらを踏まえて実際設定すべきアクションをみていきましょう。

ボディには作成アクションの「ボディ」で作成したものを設定しています。

Body

{
  "request": {
    "createLink": true,
    "settings": {
      "allowAnonymousAccess": true,
      "linkKind": 6,
      "expiration": null,
      "restrictShareMembership": false,
      "updatePassword": false,
      "password": "",
      "description": "テスト",
      "role": 8,
      "applicationLink": false,
      "limitUseToApplication": false
    }
  }
}

ファイルの要求リンク作成時はパスワードは設定できないので、これらの中で設定変更する箇所といえば "description"ですね。

上記のJSONでは"テスト"が設定されていますが、この設定によって以下のように表示されます。

ここに表示される文言を変更したい場合は "description"の値を変更してください。

続いてREST APIを送信している箇所(HTTP要求)の設定値ですが以下のようにしています。

サイトのアドレス

[フォルダがあるサイトのアドレス]

方法

POST

URI

_api/web/lists/GetByTitle('Documents')/items('@{outputs('パスによるフォルダー_メタデータの取得')?['body/ItemId']}')/ShareLink

ヘッダー

{
    "Accept": "application/json;odata=verbose"
}

ボディ

@{outputs('Body')}

URIGetByTitle('Documents') が環境によって異なってくることあるかな?ということぐらいですかね。

以上でファイルの要求リンクを取得することができます!

余談ですがリンクだけ取得したい場合は以下で取得できます。

@{body('SharePoint_に_HTTP_要求を送信します')?['d']?['ShareLink']?['sharingLinkInfo']?['Url']}

結構階層深いですね。

おわりに

ファイルの要求リンクを作成するアクションも早く標準アクションとして追加して欲しいですねー

Azure OpenAI Service On Your Dataを試してみる

はじめに

Azure OpenAI Service On Your Dataをいまだに試せていなかったのでいい機会なので試してみたレポです。

参考文献

techcommunity.microsoft.com

learn.microsoft.com

learn.microsoft.com

リソースの作成

まずは https://portal.azure.com/#create/Microsoft.CognitiveServicesOpenAI よりリソースの作成を行います。

そんなに難しいことはないので割愛。

最近日本リージョン(Japan East)も作成できるようになりましたね。

ただ、Japan Eastがどのモデルを利用可能なのか?現時点では公式ドキュメントが更新されておらずわからないですね。

learn.microsoft.com

試しにデプロイしてみてみましたが、利用できるモデルはまだないっぽいですね。

今ならEast USあたりが検証で利用するなら無難なんじゃないですかね?

この記事ではEast USを利用しています。

モデルのデプロイ

Azure OpenAI StudioAzure OpenAI Studio - Microsoft Azureよりモデルのデプロイを行います。

公式ドキュメントの注意にて、

注意
開始するためには、Azure OpenAI へのアクセスが既に承認されており、gpt-35-turbo または gpt-4 モデルがデプロイされた Azure OpenAI Service リソースがある必要があります。

と記載があるので、"gpt-35-turbo"をデプロイしました。

独自データの登録

「プライグラウンド」 > 「チャット」 > 「Add your data (preview)」より「Add a data source」を選択します。

選択可能なデータソースは現在3つ用意されています。

  • Azure Cognitive Search
  • Azure Blob Storage
  • Upload files

今回は"Upload files"を選択します。

Data sourceで"Upload files"を選択した場合は、

  • Blob storage
  • Cognitive Search

が必要になってきますが、

という制限に気を付けてください。

Data source, Blob, Cognitive Searchを選択したら次はファイルのアップロードです。

アップロードするファイルは以下のファイル形式である必要があります。

また、ファイルサイズは16MB以下である必要があります。

適当にドキュメント作成してみたのでこれらで試してみます。

あとは保存して閉じると、以下のようにデータの追加が行われるので完了するまで少し待ちましょう。

完了したら早速チャットを打って試してみましょう。

まずはChatGPTに作成してもらったGitHubアカウントの作成申請手順(Markdown)が引っかかるか試してみます。

結果はご覧の通り。

"reference"を選択すると、参考ドキュメントが表示されます。

他にも試してみましょう!

パワポの資料だったのですが、いい感じですね!

"reference"が2つありますが、関連するページが2つあるから引っかかったっぽいですね。

Part 1

Part 2

パワポの資料はこんな感じ。

パブリックとプライベートについて解説と、作成方法がある感じですね。

さすがにパワポのサムネは表示してくれないっぽいですね。

記載内容は考えるの面倒だったのでAvePointさんのこちらの記事を引用させてもらいました。
Teams におけるチームの作成方法とは?注意すべきポイントも解説 - AvePoint Blog

ちなみにこれらのやり取りのJSON結果はこんな感じです。

[
    {
        "role": "system",
        "content": "You are an AI assistant that helps people find information."
    },
    {
        "role": "user",
        "content": "GitHubアカウントを作成するにはどうすればよいですか?"
    },
    {
        "role": "assistant",
        "content": "GitHubアカウントを作成するには、以下の手順を実行してください:\n\n1. GitHubのウェブサイト([https://github.com](https://github.com))にアクセスしてください。\n2. \"Sign Up\"(サインアップ)ボタンをクリックしてください。\n3. 必要な情報を入力し、アカウント登録を完了させてください。以下の情報が必要です:\n   - ユーザー名(Username):社内の一般的なユーザー名を選択するか、プロジェクトと関連付けられた個人名を使用してください。\n   - パスワード(Password):強力なパスワードを選択し、定期的に変更するようにしてください。他のサービスのパスワードとは異なるものを使用してください。\n   - メールアドレス(Email address):会社のメールアドレスを使用してください。\n   - その他の詳細情報を入力してください。\n4. GitHubの利用規約とプライバシーポリシーに同意し、登録を完了させてください。\n\nこれでGitHubアカウントの作成が完了しました。GitHubを使用してコードの共有やバージョン管理などの作業を行うことができます。\n\n[doc2]"
    },
    {
        "role": "user",
        "content": "Teamsのプライベートチャネルの作成を行いたいです。"
    },
    {
        "role": "assistant",
        "content": "Teamsのプライベートチャネルを作成するには、以下の手順を実行してください:\n\n1. Teamsアプリケーションを開きます。\n2. チームの一覧から、プライベートチャネルを作成したいチームを選択します。\n3. チームのヘッダーの下にある「チャネルの追加」アイコンをクリックします。\n4. 「プライベートチャネルの作成」を選択します。\n5. チャネルの名前と説明を入力します。\n6. プライベートチャネルにアクセスできるメンバーを選択します。\n7. 「作成」をクリックして、プライベートチャネルを作成します。\n\nこれでTeamsのプライベートチャネルの作成が完了しました。プライベートチャネルを使用して、特定のメンバーとのコミュニケーションやプロジェクトの管理を行うことができます。\n\n[doc1] [doc2]"
    }
]

ちなみにこの操作により、Blobにファイルが作成されて、Cognitive Searchにインデックスが作成されます。

呼び出してみる

Postmanから呼び出す

こちらの公式ドキュメントを参考に呼び出しを行っていきます。

learn.microsoft.com

呼び出しを行うには以下の変数が必要だと案内されています。

ただ、"ChatGptUrl"と"ChatGptKey"はAOAIのリソース名とキー、デプロイ名で作成できるので、変数は全部で6つで済みますね。

一応上記環境変数を作成するJSONはこちら。

{
    "id": "74f5dc99-3531-434e-a291-e1d613aff209",
    "name": "Azure OpenAI Services",
    "values": [
        {
            "key": "AOAI-resorceName",
            "value": "[Please Input Your Value]",
            "type": "default",
            "enabled": true
        },
        {
            "key": "AOAI-deploymentName",
            "value": "[Please Input Your Value]",
            "type": "default",
            "enabled": true
        },
        {
            "key": "AOI-apiKey",
            "value": "[Please Input Your Value]",
            "type": "secret",
            "enabled": true
        },
        {
            "key": "Cognitive-Search-resorceName",
            "value": "[Please Input Your Value]",
            "type": "default",
            "enabled": true
        },
        {
            "key": "Cognitive-Search-apiKey",
            "value": "[Please Input Your Value]",
            "type": "secret",
            "enabled": true
        },
        {
            "key": "Cognitive-Search-indexName",
            "value": "[Please Input Your Value]",
            "type": "secret",
            "enabled": true
        }
    ],
    "_postman_variable_scope": "environment",
    "_postman_exported_at": "2023-07-23T06:46:47.107Z",
    "_postman_exported_using": "Postman/10.15.8"
}

これらの情報を元にリクエストを投げると以下のようになります。

POST https://{{AOAI-resorceName}}/openai/deployments/{{AOAI-deploymentName}}/extensions/chat/completions?api-version=2023-06-01-preview

Header

Content-Type:application/json
api-key:{{AOI-apiKey}}
chatgpt_url:https://{{AOAI-resorceName}}/openai/deployments/{{AOAI-deploymentName}}/chat/completions?api-version=2023-03-15-preview
chatgpt_key:{{AOI-apiKey}}

Body

{
    "dataSources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "https://{{Cognitive-Search-resorceName}}.search.windows.net",
                "key": "{{Cognitive-Search-apiKey}}",
                "indexName": "{{Cognitive-Search-indexName}}"
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "Teamsのプライベートチャネルの作成を行いたいです。"
        }
    ]
}

これをPOSTすると以下のような結果が返ってきます。

結果

{
 {
    "id": "c9444215-fae1-4c17-bc1a-3e5dd065e9a1",
    "model": "gpt-35-turbo-16k",
    "created": 1690094538,
    "object": "chat.completion",
    "choices": [
        {
            "index": 0,
            "messages": [
                {
                    "index": 0,
                    "role": "tool",
                    "content": "{\"citations\": [{\"content\": \"\継\続\的\な\監\視\と\リ\ソ\ー\ス\の\最\適\な\利\用\を\促\進\す\る\た\め\に\、\定\期\的\なSubscription\の\レ\ビ\ュ\ー\と\更\新\を\行\っ\て\く\だ\さ\い\。\\n3. \サ\ブ\ス\ク\リ\プ\シ\ョ\ン\管\理\\n1. Subscription\所\有\者\は\、\リ\ソ\ー\ス\の\適\切\な\管\理\と\セ\キ\ュ\リ\テ\ィ\を\確\保\す\る\責\任\が\あ\り\ま\す\。\不\要\な\リ\ソ\ー\ス\を\削\除\し\、\セ\キ\ュ\リ\テ\ィ\設\定\を\定\期\的\に\確\認\し\て\く\だ\さ\い\。\\n2. \重\要\な\リ\ソ\ー\ス\に\は\適\切\な\タ\グ\を\付\け\、\コ\ス\ト\管\理\と\レ\ポ\ー\ト\作\成\を\容\易\に\し\て\く\だ\さ\い\。\\n3. \組\織\全\体\の\ガ\バ\ナ\ン\ス\ポ\リ\シ\ー\に\従\っ\て\、\リ\ソ\ー\ス\の\設\定\と\ア\ク\セ\ス\権\を\適\切\に\管\理\し\て\く\だ\さ\い\。\\n4. \定\期\的\な\監\査\と\コ\ス\ト\最\適\化\の\取\り\組\み\を\行\い\、\無\駄\な\リ\ソ\ー\ス\使\用\を\防\止\し\て\く\だ\さ\い\。\\n\こ\の\資\料\は\、Azure Subscription\の\申\請\手\順\と\ル\ー\ル\に\関\す\る\も\の\で\す\。\適\切\な\承\認\と\コ\ス\ト\管\理\を\行\い\、\セ\キ\ュ\リ\テ\ィ\を\確\保\し\な\が\らAzure\リ\ソ\ー\ス\を\効\果\的\に\活\用\し\て\く\だ\さ\い\。\も\し\さ\ら\な\る\質\問\や\不\明\点\が\あ\る\場\合\は\、\遠\慮\な\く\お\知\ら\せ\く\だ\さ\い\。\", \"id\": null, \"title\": \"\内\容\", \"filepath\": \"Apply for Subscription.docx\", \"url\": \"https://[BlobStorage].blob.core.windows.net/fileupload-[CognitiveSearchIndex]/Apply%20for%20Subscription.docx\", \"metadata\": {\"chunking\": \"orignal document size=521. Scores=7.3893723 and None.Org Highlight count=63.\"}, \"chunk_id\": \"0\"}, {\"content\": \"Teams\チ\ー\ム\作\成\ル\ー\ル\\n\更\新\日: 2023/07/20\\n\プ\ラ\イ\ベ\ー\ト\チ\ー\ム\と\は\\n\プ\ラ\イ\ベ\ー\ト\チ\ー\ム\は\、\メ\ン\バ\ー\追\加\に\制\限\を\持\た\せ\る\こ\と\で\個\別\の\や\り\取\り\が\可\能\な\チ\ー\ム\で\す\。\よ\っ\て\プ\ラ\イ\ベ\ー\ト\チ\ー\ム\の\存\在\は\、\管\理\者\と\所\属\す\る\メ\ン\バ\ー\以\外\は\確\認\で\き\ま\せ\ん\。\プ\ラ\イ\ベ\ー\ト\チ\ー\ム\に\新\た\な\メ\ン\バ\ー\を\追\加\す\る\方\法\は\次\の 3 \つ\で\す\。 \\n\チ\ー\ム\所\有\者\に\よ\る\メ\ン\バ\ー\追\加 \\n\メ\ン\バ\ー\か\ら\追\加\の\リ\ク\エ\ス\ト\を\チ\ー\ム\所\有\者\に\依\頼\し\、\承\認\を\受\け\る \\n\チ\ー\ム\所\有\者\の\み\が\知\る\「\コ\ー\ド\」\を\伝\え\る \\n\プ\ラ\イ\ベ\ー\ト\チ\ー\ム\は\、\部\や\プ\ロ\ジ\ェ\ク\ト\と\い\っ\た\範\囲\よ\り\も\さ\ら\に\小\さ\な\範\囲\で\利\用\し\や\す\い\種\類\と\い\え\ま\す\<e3><80><82> \\n\パ\ブ\リ\ッ\ク\チ\ー\ム\と\は\\n\パ\ブ\リ\ッ\ク\チ\ー\ム\は\、\誰\で\も\参\加\で\き\る\チ\ー\ム\で\す\。\前\述\し\た\プ\ラ\イ\ベ\ー\ト\チ\ー\ム\と\は\対\照\的\に\、\メ\ン\バ\ー\の\追\加\に\一\切\の\制\限\が\あ\り\ま\せ\ん\。 \\n\パ\ブ\リ\ッ\ク\チ\ー\ム\に\は\、\組\織\内\に\所\属\す\る\ユ\ー\ザ\ー\で\あ\れ\ば\チ\ー\ム\所\有\者\の\承\認\を\要\す\る\こ\と\な\く\、\誰\で\も\参\加\で\き\ま\す\。 \\n\ま\た\、\プ\ラ\イ\ベ\ー\ト\チ\ー\ム\の\作\成\後\も\「\プ\ラ\イ\バ\シ\ー\設\定\」\を\変\更\す\れ\ば\、\パ\ブ\リ\ッ\ク\チ\ー\ム\に\移\行\で\き\る\の\で\す\。\プ\ラ\イ\バ\シ\ー\設\定\の\変\更\方\法\は\、\以\下\を\チ\ェ\ッ\ク\し\て\く\だ\さ\い\。 \\n\チ\ー\ム\名\に\移\動 \\n\「\そ\の\他\の\オ\プ\シ\ョ\ン\」\を\選\択 \\n \メ\ニ\ュ\ー\の\下\部\に\あ\る\「\チ\ー\ム\の\編\集\」\を\選\択 \\n\「\パ\ブ\リ\ッ\ク\」\ま\た\は\「\プ\ラ\イ\ベ\ー\ト\」\を \選\択 \\n\パ\ブ\リ\ッ\ク\チ\ー\ム\は\誰\で\も\参\加\で\き\る\も\の\で\あ\る\だ\け\に\、\チ\ー\ム\内\で\の\や\り\と\り\や\情\報\の\扱\い\に\は\注\意\が\必\要\で\す\。 \\n\プ\ラ\イ\ベ\ー\ト\チ\ー\ム\の\作\成\方\法\\n\「Teams\」\の\ア\イ\コ\ン\を\選\択 \\n\チ\ー\ム \リ\ス\ト\の\下\部\に\あ\る\「\チ\ー\ム\参\加\」\ま\た\は\「\チ\ー\ム\の\作\成\」\を\選\択 \\n\「\チ\ー\ム\の\作\成\」\カ\ー\ド\に\カ\ー\ソ\ル\を\合\わ\せ\、\チ\ー\ム\の\「\参\加\」\ま\た\は\「\作\成\す\る \」\を\選\択 \\n\「\ゼ\ロ\か\ら\」\を\選\択 \\n\「\プ\ラ\イ\ベ\ー\ト\」\を\選\択 \\n\チ\ー\ム\の\名\前\を\入\力 \\n\完\了\し\た\な\ら\ば\「\作\成\」\を\選\択\", \"id\": null, \"title\": \"Teams\チ\ー\ム\作\成\ル\ー\ル\", \"filepath\": \"\チ\ー\ム\作\成\方\法.pptx\", \"url\": \"https://[BlobStorage].blob.core.windows.net/fileupload-[CognitiveSearchIndex]/%E3%83%81%E3%83%BC%E3%83%A0%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95.pptx\", \"metadata\": {\"chunking\": \"orignal document size=984. Scores=6.312032 and None.Org Highlight count=82.\"}, \"chunk_id\": \"0\"}, {\"content\": \"<p>GitHub\ア\カ\ウ\ン\ト\作\成\に\関\す\る\ル\ー\ル</p>\\n<ol>\\n<li>\社\内\で\の\ア\カ\ウ\ン\ト\名\は\、\プ\ロ\ジ\ェ\ク\ト\や\チ\ー\ム\と\関\連\し\て\い\る\こ\と\が\望\ま\し\い\で\す\が\、\個\人\を\特\定\す\る\個\人\名\を\含\む\こ\と\は\避\け\て\く\だ\さ\い\。</li>\\n<li>\ア\カ\ウ\ン\ト\の\パ\ス\ワ\ー\ド\は\定\期\的\に\変\更\し\て\く\だ\さ\い\。\他\の\サ\ー\ビ\ス\と\同\じ\パ\ス\ワ\ー\ド\を\使\用\し\な\い\で\く\だ\さ\い\。</li>\\n<li>\組\織\や\チ\ー\ム\が\共\有\の\リ\ポ\ジ\ト\リ\を\作\成\す\る\場\合\は\、\適\切\な\権\限\設\定\を\行\っ\て\く\だ\さ\い\。\不\必\要\な\情\報\が\共\有\さ\れ\な\い\よ\う\に\注\意\し\て\く\だ\さ\い\。</li>\\n<li>\セ\キ\ュ\リ\テ\ィ\上\の\理\由\か\ら\、\他\の\メ\ン\バ\ー\のGitHub\ア\カ\ウ\ン\ト\を\不\正\に\使\用\す\る\こ\と\は\厳\禁\で\す\。</li>\\n<li>\ア\カ\ウ\ン\ト\に\関\す\る\問\題\が\発\生\し\た\場\合\は\、\す\ぐ\に\セ\キ\ュ\リ\テ\ィ\担\当\者\に\連\絡\し\て\く\だ\さ\い\。</li>\\n</ol>\\n<hr />\\n<p>\こ\の\ド\キ\ュ\メ\ン\ト\は\、GitHub\ア\カ\ウ\ン\ト\の\作\成\方\法\と\ル\ー\ル\に\つ\い\て\説\明\し\て\い\ま\す\。\ア\カ\ウ\ン\ト\の\作\成\や\管\理\に\際\し\て\は\、\セ\キ\ュ\リ\テ\ィ\と\プ\ラ\イ\バ\シ\ー\を\重\視\し\、\社\内\の\ル\ー\ル\に\従\っ\て\適\切\に\行\っ\て\く\だ\さ\い\。\も\し\疑\問\点\や\問\題\が\あ\る\場\合\は\、\い\つ\で\も\質\問\し\て\く\だ\さ\い\。</p>\", \"id\": null, \"title\": \"GitHub\ア\カ\ウ\ン\ト\作\成\手\順\と\ル\ー\ル\", \"filepath\": \"Create-Account.md\", \"url\": \"https://[BlobStorage].blob.core.windows.net/fileupload-[CognitiveSearchIndex]/Create-Account.md\", \"metadata\": {\"chunking\": \"orignal document size=586. Scores=5.996308 and None.Org Highlight count=80.\"}, \"chunk_id\": \"0\"}, {\"content\": \"\内\容\\nAzure Subscription\申\請\ル\ー\ル\\t2\\n1. \申\請\手\順\\t2\\n2. Subscription\申\請\ル\ー\ル\\t2\\n3. \サ\ブ\ス\ク\リ\プ\シ\ョ\ン\管\理\\t2\\nAzure Subscription\申\請\ル\ー\ル\\n\こ\の\資\料\は\、\社\内\メ\ン\バ\ー\がAzure Subscription\を\申\請\し\、\使\用\す\る\際\の\手\順\と\ル\ー\ル\を\定\め\た\も\の\で\す\。\\n1. \申\請\手\順\\n1. Azure Portal\に\ア\ク\セ\ス\し\て\く\だ\さ\い\。\\n2. \「Subscriptions\」\(\サ\ブ\ス\ク\リ\プ\シ\ョ\ン\)\セ\ク\シ\ョ\ン\に\移\動\し\、\「+ Add\」\(\追\加\)\ボ\タ\ン\を\ク\リ\ッ\ク\し\ま\す\。\\n3. \要\件\に\応\じ\て\、\新\し\いSubscription\を\作\成\す\る\か\、\既\存\のSubscription\に\参\加\(\加\入\)\す\る\か\を\選\択\し\ま\す\。\\n4. \必\要\な\情\報\を\入\力\し\、\申\請\を\完\了\し\て\く\だ\さ\い\。\\n\· Subscription\タ\イ\プ: \プ\ロ\ダ\ク\シ\ョ\ン\環\境\や\テ\ス\ト\用\途\な\ど\、\適\切\な\タ\イ\プ\を\選\択\し\て\く\だ\さ\い\。\\n\· \請\求\情\報: \申\請\時\に\適\切\な\請\求\情\報\を\提\供\し\て\く\だ\さ\い\。\\n\· \リ\ソ\ー\ス\制\限: \利\用\可\能\な\リ\ソ\ー\ス\制\限\に\つ\い\て\は\、\適\切\な\範\囲\内\で\申\請\し\て\く\だ\さ\い\。\\n\· \管\理\者\ア\ク\セ\ス: \必\要\に\応\じ\て\、Subscription\の\管\理\者\を\指\定\し\て\く\だ\さ\い\。\\n2. Subscription\申\請\ル\ー\ル\\n1. Subscription\の\作\成\・\参\加\は\、\必\要\な\プ\ロ\ジ\ェ\ク\ト\や\タ\ス\ク\が\あ\り\、\か\つ\承\認\さ\れ\た\場\合\に\の\み\許\可\さ\れ\ま\す\。\無\駄\なSubscription\の\作\成\を\避\け\る\た\め\に\、\理\由\が\明\確\に\説\明\さ\れ\て\い\る\こ\と\が\求\め\ら\れ\ま\す\。\\n2. \新\し\いSubscription\を\作\成\す\る\場\合\、\所\属\す\る\プ\ロ\ジ\ェ\ク\ト\の\責\任\者\ま\た\は\上\司\か\ら\の\承\認\が\必\要\で\す\。\そ\の\際\に\は\、\承\認\者\の\氏\名\と\電\子\メ\ー\ル\ア\ド\レ\ス\を\申\請\フ\ォ\ー\ム\に\記\載\し\て\く\だ\さ\い\。\\n3. Subscription\の\利\用\に\関\連\す\る\費\用\は\、\プ\ロ\ジ\ェ\ク\ト\予\算\内\で\管\理\さ\れ\る\必\要\が\あ\り\ま\す\。\利\用\が\終\了\し\た\場\合\、Subscription\は\必\要\に\応\じ\て\削\除\す\る\よ\う\に\し\て\く\だ\さ\い\。\\n4. \組\織\全\体\の\セ\キ\ュ\リ\テ\ィ\を\確\保\す\る\た\め\に\、\パ\ス\ワ\ー\ド\と\認\証\情\報\は\適\切\に\管\理\し\、\他\の\メ\ン\バ\ー\と\共\有\し\な\い\よ\う\に\し\て\く\だ\さ\い\。\\n5\", \"id\": null, \"title\": \"\内\容\", \"filepath\": \"Apply for Subscription.docx\", \"url\": \"https://[BlobStorage].blob.core.windows.net/fileupload-[CognitiveSearchIndex]/Apply%20for%20Subscription.docx\", \"metadata\": {\"chunking\": \"orignal document size=996. Scores=5.4509835 and None.Org Highlight count=96.\"}, \"chunk_id\": \"1\"}, {\"content\": \"\こ\こ\で\設\定\す\る\初\期\メ\ン\バ\ー\以\外\に\も\、\後\か\ら\メ\ン\バ\ー\の\追\加\が\可\能\で\す\。\ま\た\、\追\加\す\る\メ\ン\バ\ー\に\対\し\て\「\所\有\者\の\権\限\」\も\付\与\で\き\ま\す\。 \\n\パ\ブ\リ\ッ\ク\チ\ー\ム\の\作\成\方\法\\n\「Teams\」\の\ア\イ\コ\ン\を\選\択 \\n\チ\ー\ム \リ\ス\ト\の\下\部\に\あ\る\「\チ\ー\ム\参\加\」\ま\た\は\「\チ\ー\ム\の\作\成\」\を\選\択 \\n\「\チ\ー\ム\の\作\成\」\カ\ー\ド\に\カ\ー\ソ\ル\を\合\わ\せ\、\チ\ー\ム\の\「\参\加\」\ま\た\は\「\作\成\す\る \」\を\選\択 \\n\「\ゼ\ロ\か\ら\」\を\選\択 \\n\「\パ\ブ\リ\ッ\ク\」\を\選\択 \\n\チ\ー\ム\の\名\前\を\入\力 \\n\完\了\し\た\な\ら\ば\「\作\成\」\を\選\択 \\n\メ\ン\バ\ー\を\追\加\し\た\い\と\き\、\パ\ブ\リ\ッ\ク\チ\ー\ム\の\場\合\は\メ\ン\バ\ー\か\ら\の\参\加\依\頼\を\待\つ\か\、\必\要\に\応\じ\て\メ\ン\バ\ー\を\追\加\す\る\だ\け\で\す\。\", \"id\": null, \"title\": \"Teams\チ\ー\ム\作\成\ル\ー\ル\", \"filepath\": \"\チ\ー\ム\作\成\方\法.pptx\", \"url\": \"https://[BlobStorage].blob.core.windows.net/fileupload-[CognitiveSearchIndex]/%E3%83%81%E3%83%BC%E3%83%A0%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95.pptx\", \"metadata\": {\"chunking\": \"orignal document size=363. Scores=5.151559 and None.Org Highlight count=39.\"}, \"chunk_id\": \"1\"}], \"intent\": \"[\\\"Teams\の\プ\ラ\イ\ベ\ー\ト\チ\ャ\ネ\ル\の\作\成\方\法\を\教\え\て\く\だ\さ\い\。\\\"]\"}",
                    "end_turn": false
                },
                {
                    "index": 1,
                    "role": "assistant",
                    "content": "Teamsのプライベートチャネルの作成方法については、以下の手順を参考にしてください。\n\n1. Teams アプリを開きます。\n2. チームを選択します。\n3. チームのタブから「チャネル」を選択します。\n4. 「新しいチャネルを追加」をクリックします。\n5. チャネル名と説明を入力します。\n6. 「プライベート」オプションを選択します。\n7. チャネルにアクセスするメンバーを選択します。\n8. 「作成」をクリックして、プライベートチャネルを作成します。\n\nこれにより、プライベートチャネルが作成され、選択したメンバーのみがアクセスできるようになります。\n\n[doc1]",
                    "end_turn": true
                }
            ]
        }
    ]
}

一部省略しています。

choices/messages/content内に検索するドキュメントの情報が入っていますね。

Power Automateから呼び出す

Postmanから呼び出すのと大差ないです。

作成アクションで必要な変数を作成しています。

ちゃんとやるなら環境変数にしたほうがいいですね。

learn.microsoft.com

learn.microsoft.com

今回はわざわざソリューションでやるのめんどうだったので割愛。

あとはこれらの情報をもとにPOSTを行うだけですね。

URI

https://@{outputs('AOAI-resorceName')}/openai/deployments/@{outputs('AOAI-deploymentName')}/extensions/chat/completions?api-version=2023-06-01-preview

ヘッダー

{
    "Content-Type": "application/json",
    "api-key": @{outputs('AOI-apiKey')},
    "chatgpt_url": "https://@{outputs('AOAI-resorceName')}/openai/deployments/@{outputs('AOAI-deploymentName')}/chat/completions?api-version=2023-03-15-preview",
    "chatgpt_key": @{outputs('AOI-apiKey')}
}

Body

{
    "dataSources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "https://@{outputs('Cognitive-Search-resorceName')}.search.windows.net",
                "key": "@{outputs('Cognitive-Search-apiKey')}",
                "indexName": "@{outputs('Cognitive-Search-indexName')}"
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "Teamsのプライベートチャネルの作成を行いたいです。"
        }
    ]
}

おわりに

こちらの方法を利用することで、Blobにファイルをアップロードして、Cognitive Searchにインデックスを付与する。
という一連の操作を自動でやってくれるようになります。

7/29(土) & 7/30(日)にAzure OpenAI のハッカソンがありますので、こちらも興味ある方はご参加してくださいねー
katte.connpass.com

事前学習としては現在"Microsoft Learn AI Skills Challenge"というものが開催されていますのでこちらでの学習が役に立つかと思います!

aka.ms

いくつかコンテンツがありますが、今回ですと"Cognitive Services Challenge"が丁度いいですかね。


スポンサードリンク