ささみ学習帳 - sasami's study book

ささみ学習帳

Microsoft365 や Power Platform について学んだこと・アイデアのメモ

Microsoft Copilot に共有フォルダーを参照させることができる「ファイル共有」コネクタを検証してみた

はじめに

Microsoft Copilot を社内で使い始めると、「ファイルサーバーに置いてある資料も検索できないか」と考える場面があります。 SharePoint Online や OneDrive for Business のファイルとは異なり、ファイルサーバー上の資料を参照するには、外部データを接続するための設定が必要です。 それを実現するのが、Microsoft 365 Copilot コネクタの「ファイル共有(File Share)」コネクタです。

Microsoft 365 Copilot コネクタとは

Microsoft 365 Copilot コネクタは、Microsoft 365 の外部にあるデータを Copilot や Microsoft Search で利用するための仕組みです。以前はMicrosoft Graphコネクタと呼ばれていました。

コネクタは、大きく次の2種類に分けられます。

方式 データの扱い 向いている用途
同期コネクタ 外部コンテンツを取り込み、Microsoft Graph にインデックス化する 文書やナレッジを継続的に検索する
フェデレーションコネクタ Microsoft 365 にインデックス化せず、MCP を通じて問い合わせ時に外部システムから取得する 動的なデータや、ソース側に保持したまま利用したいデータ

同期コネクタには、管理者が構成する方式と、管理者が有効化した後にユーザーが接続するセルフサービス方式があります。 フェデレーションコネクタには、ギャラリーから利用できるもののほか、独自のMCPサーバーを使用する構成もあります。

今回扱うファイル共有コネクタは、同期コネクタです。 オンプレミスの Windows ファイル共有をクロールし、対象ファイルの情報をインデックス化します。そのため、ファイルサーバー上の変更が検索結果に反映されるタイミングは、クロールの実行時期に左右されます。

ファイル共有コネクタとは

ファイル共有コネクタは、オンプレミスの Windows ファイル共有を Microsoft Search と Microsoft Copilot から検索できるようにするコネクタです。対象ファイルを対象ファイルをインデックス化すると、文書の検索だけでなく、内容に関する自然言語での質問にも利用できます。

取り込めるファイル形式

公式資料には、次のファイル形式が対応形式として記載されています。

DOC / DOCM / DOCX / DOT / DOTX / EML / GIF / HTML / JPEG / JPG / MHT / MHTML / MSG / NWS / OBD / OBT / ODP / ODS / ODT / ONE / PDF / PNG / POT / PPS / PPT / PPTM / PPTX / TXT / XLB / XLC / XLSB / XLS / XLSX / XLT / XLXM / XML / XPS / ZIP

ただし、対応形式に含まれていても、すべてのファイル内容を同じように検索できるとは限りません。 インデックス化の対象となるのはテキストコンテンツです。マルチメディアの内容は対象外で、画像などのマルチメディアやその他のファイル形式については、メタデータのみがインデックス化されます。

取り込み対象は、ファイル形式、最終更新日、保存場所によって絞り込めます。まず対象範囲を限定し、検索結果とアクセス許可を確認してから徐々に広げると、動作を確認しやすくなります。

制限事項

公式資料には、次の制限が記載されています。

項目 公式資料に記載された制限
1ファイルの最大サイズ 100 MB。超えるファイルはインデックス化されない
処理後サイズの上限 4 MB。到達すると処理が停止し、ファイル内の一部の語句を検索できない場合がある
1接続あたりのファイル共有数 最大20個。共有ごとに1行ずつ入力する
インデックス化に非対応のもの シンボリックリンク、NTFS ジャンクション、ボリュームマウントポイント

検索結果を表示する範囲とアクセス許可

ファイル共有コネクタでは、ファイルサーバー上のアクセス許可を引き継ぎ、検索結果を表示するユーザーを制限できます。 Microsoft 365管理センターの Copilot > コネクタ > 自分のつながり から接続の詳細を開くと、設定されているアクセス許可を確認できます。 各設定の意味は次のとおりです。

設定 検索結果の表示範囲
このデータソースにアクセスできるユーザーのみ ソースシステムの ACL に基づいて制限する
すべてのユーザー 組織内のすべてのユーザーに表示する

「このデータソースにアクセスできるユーザーのみ」を選択すると、ソースのアクセス制御リストのユーザーだけが検索結果を表示できます。 この設定では、検索権限の判定基準として、ファイル共有のアクセス許可または NTFSファイルのアクセス許可を選択できます。アクセス制御リストに指定するユーザーとグループは、Active Directory(AD)で管理されている必要があります。

「すべてのユーザー」を選択すると、検索結果の表示にはソース側のアクセス制限が適用されません。元のファイルを開く際にはソース側のアクセス制御が適用されますが、 検索結果に表示されることと、元のファイルを開けることは分けて考える必要があります。

今回は、Active Directoryがない環境で検証しました。そのため、以降の動作確認では「すべてのユーザー」を選択しています。

Copilot の各機能ではどのように表示されるか?

Copilot Chat の回答に引用される

ファイル共有コネクタを構成すると、データソースとして「FileShare」が有効になります。

「FileShare」がonになっている場合、回答のソースとして使われることを確認できました。 ファイル共有コネクタのデータが参照されると、ソースを示すアイコンとしてフォルダーのアイコンが表示されます。

ファイル共有の内容は暗黙的に検索されるようです。一方で、「FileShareを検索して」や「ファイル共有コネクタを検索して」のように、検索対象を明示することもできました。

リサーチツールの回答に引用される

ファイル共有コネクタを構成すると、リサーチツールでもソースとして「FileShare」が有効になります。

「FileShare」がonになっている場合、回答のソースとして使われることを確認できました。 ファイル共有コネクタのデータが参照されると、ソースを示すアイコンとしてフォルダーのアイコンが表示されます。

エージェントビルダーのナレッジに指定できる

Microsoft 365 Copilot のエージェントビルダーでは、Copilot コネクタの情報をエージェントのナレッジソースとして指定できます。 エージェントビルダーにアクセスすると、「ナレッジ」のCopilotコネクタから、ファイル共有コネクタの接続を個別に有効化できます。

ファイル共有コネクタのデータが参照されると、ソースを示すアイコンとしてフォルダーのアイコンが表示されます。

Copilot Studio のナレッジに追加できる

Copilot Studio では、管理者が構成した Microsoft 365 Copilot コネクタをエージェントのナレッジソースとして追加できます。2026年10月時点では、Standard Harnessで動作するエージェントでのみ追加できました。

テナントでファイル共有コネクタが構成されると、Copilot Studio のエージェントにある [ナレッジの追加]>[詳細設定]に「File share」が表示されます。

「File share」を選択すると、ナレッジに追加するファイル共有コネクタの接続を選べます。

テストチャットでプロンプトを送信したところ、回答が返されました。回答の表示から、File Shareナレッジが使用されていることも確認できました。

ファイル共有コネクタの設定方法

ファイル共有コネクタは、次の4段階で構成します。

  1. Microsoft Entra ID にアプリを登録する
  2. Graph コネクタ エージェントをインストール・構成する
  3. Microsoft 365 管理センターでファイル共有接続を作成する
  4. クロール、検索結果、アクセス許可を確認する

前提条件を確認する

作業前に、少なくとも次の条件を確認します。

  • 対象がオンプレミスの Windows ファイル共有であること
  • エージェントからデータソースと必要なクラウド側サービスへ通信できる
  • 対象ファイルを読み取れる Windows アカウントを用意できる
  • 接続を管理する担当者に、作業に必要な管理者ロールが割り当てられている
  • エージェントをインストールできるWindows PCを用意できる

公式のエージェント資料には、推奨構成として次の項目が記載されています。

  • Windows 10またはWindows Server 2016 R2以降
  • .NET Framework 4.7.2
  • .NET Core Desktop Runtime 10.0(x64)
  • 8コア、3GHz
  • 16GB RAM
  • インターネットへのポート443での接続

インデックス化の遅延を抑えるため、データソースとエージェントを同じネットワークに配置することも推奨されています。

1. Microsoft Entra ID にアプリを登録する

ここでは、Graph コネクタ エージェントの認証にクライアントシークレットを使う場合を例にします。公式資料では証明書による認証も案内されています。

  1. Azureポータルにアクセスし、テナントの管理者アカウントでサインインします。
  2. Microsoft Entra ID の アプリの登録を開き、新規登録を選択します。
  3. 識別しやすい名前で登録し、アプリケーション(クライアント)IDを控えます。
  4. API のアクセス許可 > アクセス許可の追加 > Microsoft Graph > アプリケーションのアクセス許可を開きます。
  5. 次のアクセス許可を追加します。
    • ExternalItem.ReadWrite.OwnedBy または ExternalItem.ReadWrite.All
    • ExternalConnection.ReadWrite.OwnedBy
    • Directory.Read.All
  6. テナントに対して管理者の同意を与え、権限が承認済みであることを確認します。
  7. 証明書とシークレットからクライアントシークレットを作成し、発行された値を安全な場所に保存します。

2. Graph コネクタ エージェントをインストール・構成する

  1. エージェントを配置する Windows マシンで、ランタイムとネットワーク接続を確認します。
  2. 必要な管理者権限を持つアカウントでサインインします。
  3. Microsoft の公式資料から Graph コネクタ エージェントをダウンロードします。
  4. インストーラーを実行します。
  5. 設定アシスタントを起動します。
  6. エージェント名と、手順1で用意したアプリの認証情報を設定して登録します。
  7. 登録後、Windows サービス GcaHostService が動作していることを確認します。

エージェント名には空白を使用できません。また、インストール時には、リモート署名済みスクリプトの実行を許可する PowerShell 実行ポリシーも確認します。

3. ファイル共有接続を作成する

  1. Microsoft 365 管理センターで Copilot > コネクタを開き、ギャラリーからファイル共有コネクタを選択します。
  2. 利用者が情報源を識別できる表示名を設定します。
  3. 対象のファイル共有パスと、登録済みの Graph コネクタ エージェントを指定します。
  4. 対象ファイルを読み取れる Windows アカウントの資格情報を入力します。
  5. 必要に応じてカスタムセットアップを選び、検索権限の基準を選択します。
  6. ファイル形式、最終更新日、場所による絞り込みを設定します。
  7. 接続のアクセス許可が意図した表示範囲になっていることを確認してから作成します。

Active Directory がない環境では、認証するユーザー情報には共有フォルダが存在するPCのローカルユーザーを指定することで認証させることができました。
その際は、「computer¥user」ではなく「user」と指定します。

4. 接続状態と検索結果を確認する

接続作成後は、Microsoft 365 管理センターで Copilot > コネクタ > 自分のつながりで状態を確認します。

状態 意味
同期中 データソースをクロールし、アイテムをインデックス化している
準備完了 接続を利用でき、実行中のクロールはない。最終同期時刻で直近の成功したクロールを確認できる
一時停止 管理者がクロールを一時停止している。取り込み済みデータは検索可能
失敗 重大なエラーが発生しており、内容に応じた手動対応が必要
削除失敗 接続の削除に失敗している。理由を確認して再試行する

準備完了 になったら、Microsoft Search と Copilot で対象文書を探します。確認したいのは、見つかるべきファイルが見つかるかだけではありません。権限のない利用者に表示されないかも確認します。

接続の詳細画面では、パラメーターの確認を行うことができます。 詳細タブには、パラメータ尾の表示だけでなく、Copilot Chat への表示可否を制御する設定も可能です。 インデックスブラウザータブでは、取り込み内容とアクセス許可の検証を行うことができます。

うまく取り込めないときに確認すること

接続を作成できても、ファイルが取り込まれない、あるいは期待したように表示されない場合があります。症状に応じて確認する点を整理しました。

.msg や .doc などの旧形式ファイルが対象の場合

公式資料では、旧形式ファイルを取り込む場合、エージェントのホストに Microsoft Visual C++ 2012 Redistributable Update 4(x86 と x64)をインストールするよう案内しています。対象ファイルを使って検証する前に確認します。

セキュリティが設定されたPDFファイルはインデックスされない

アクセス許可が設定されたPDFファイルはインデックスされない場合があるようです。この件に該当する公式情報は見つけられませんでした。 詳細の検証までは行なっていませんが、少なくとも下記のようなアクセス許可のファイルはインデックスされず、Copilot は回答できない状況になりました。

エージェントに到達できない場合

接続設定時に「Graph コネクタ エージェントに到達できない」と表示された場合、公式のトラブルシューティング資料は、エージェントの稼働状況と、アプリの認証情報が期限切れ・失効していないか、エージェントを動作させているPCの稼働状況の確認を案内しています。

ファイルが見つからない、またはアクセスできない場合は、指定したパスと Windows アカウントの権限も確認します。

接続設定を変更した場合

公開済みの接続では、名前や説明、接続設定、スキーマ、更新スケジュールなど、管理画面から編集できる項目があります。編集によってフルクロールが実行される場合があり、初回フルクロール中の変更は、次回予定されたフルクロールで適用されます。

ファイル数が多い場合

同期コネクタでは、変更が検索結果に反映されるまでにクロールが必要です。対象を大きく広げる前に、少数で同期状態、対象アイテム数、利用可能なインデックス容量を検証することをお勧めします。

Copilot Chat で「データソースの変更」が表示されない

今回確認した範囲では、Microsoft 365 Copilot コネクタを利用するためには、Microsoft 365 Copilot ライセンスが必要でした。 Microsoft 365 ライセンスのみのユーザー(M365 Copilot Basic, Copilot Chat Basic)では利用できません。

運用時に考慮したいポイント

Graph コネクタエージェントのバージョン管理

Graph コネクタエージェントの新バージョンが公開されると、設定画面に下図のように表示されます。 今回確認した範囲では、自動的にはアップデートされないようです。

クライアントシークレットの有効期限管理

今回確認した時点では、クライアントシークレットの有効期限は最長でも730日でした。 有効期限があることを認識しておく必要があります。

さいごに

ファイル共有コネクタを使用すると、オンプレミスのWindowsファイル共有に保存されている文書を、Microsoft SearchやMicrosoft 365 Copilotで利用するための接続を構成できます。今回の検証では、Copilot Chat、リサーチツール、エージェントビルダー、Copilot Studioのいずれでも、ファイル共有の情報をナレッジとして利用できることを確認しました。

オンプレミスのファイルサーバーを現在も使用している環境では、ファイル共有コネクタが有効な選択肢の一つになると感じました。 ファイルサーバーでナレッジに適したファイル管理が行われていれば、有効に機能すると思われます。

参考資料

learn.microsoft.com

learn.microsoft.com

Microsoft Teams コネクタ「チャットまたはチャネルでメッセージを投稿する」アクションのMarkdown対応について検証してみた

はじめに

Microsoft Teams コネクタの「チャットまたはチャネルでメッセージを投稿する」アクションで、条件付きですがMarkdownが使えるようなので対応状況を検証してみました。

Markdown が使用できる条件

検証した時点(2026年9月)では、下記の場合に限りMarkdownが使用可能でした。

  • 投稿者が「フローボット」
  • 投稿先が「フローボットとチャットする」

※.クラウドフローの場合は、コードビューに切り替えて入力する必要があります。

構文対応状況リスト

同アクションをクラウドフローから使用した場合と、デスクトップフローから使用した場合で、使える構文に違いがあります。

構文 クラウドフロー デスクトップフロー メモ
見出し ▲1階層のみ ▲4階層まで対応
太字テキスト ○ ○
車体テキスト ○ ○
太字斜体テキスト ○ ○
取り消し線テキスト × ×
段落 × ×
リスト ▲1階層のみ ○ 10階層まで確認
順序付きリスト × ▲1階層のみ
タスクリスト × ▲通常リスト
リンク ○ ○ リンクタイトルの表示には未対応
参照リンク × ×
メールリンク × ○
画像 ○ ○
画像リンク × ×
ブロッククォート × ○
インラインコード ○ ○
コードブロック × ○
インデントされたコードブロック × ○
テーブル × ○
水平線 × ○
改行(行末に2つのスペース) × ×
改行(HTMLの
タグ)
○ ×
改行(空白行で区切る) ○ ×
文字のエスケープ ○ ○
脚注 × ○

表示結果

検証に使用した構文と実際の表示結果です。

見出し

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

テキストの書式設定

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

段落

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

リスト

順序なしリスト

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

順序付きリスト

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

タスクリスト

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

リンク

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

画像

※画像の構文を認識することだけ確認しました

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

ブロッククォート

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

コード

インラインコード

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

コードブロック

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

インデントされたコードブロック

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

テーブル

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

水平線

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

改行

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

文字のエスケープ

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

脚注

  • 構文
  • クラウドフローから投稿
  • デスクトップフローから投稿

さいごに

クラウドフローから投稿した場合と、デスクトップフローから投稿した場合で、対応状況に大きな違いがあるのは意外な結果でした。

利用可能な条件があり使い所は限定されそうですが、覚えておくと役立つかもしれません。

www.markdownlang.com

Power Automate クラウドフローで無効な接続を監視する

はじめに

Power Automate クラウドフローを利用していると、いつの間にか接続が無効になっていることがあります。

そこで、接続の状態を定期的に確認し、無効になった接続を通知するクラウドフローを作成してみました。

Power Automate で「無効な接続」と表示される原因

Microsoft の公式情報によると、接続が無効になる原因として、以下のようなものが挙げられています。

  • ユーザーまたは管理者による更新 トークンの無効化
  • 管理者による Microsoft 365 管理センターでのパスワードのリセット
  • 条件付きアクセス ポリシーや多要素認証の設定変更
  • デバイス登録の解除など特定の認証情報の変更
  • マイ アカウント ページでの [すべてサインアウトしてください] の実行
  • 接続が長期間 (90 日以上) 使用されていない
  • 接続先サービス側の一時的な不具合

※引用元はこちら↓ jpdynamicscrm.github.io

フロー概要

Power Automate 管理コネクタの「自分の接続の一覧表示」アクションを利用すると、指定した環境の接続情報を取得できます。

環境ごとに取得した接続情報から、「status」が「Connected」ではないものを抽出して集計します。

最後に Microsoft Teams (以下 Teams)で自分宛に通知します。

動作イメージ

フロー全体

フロー解説

[スケジュール]繰り返しトリガー

今回は、毎週月曜日の13時に通知するよう設定しました。

  • パラメーター
    • 間隔
      • 1
    • 頻度
      • 週
    • タイムゾーン
      • (UTC+09:00) 大阪、札幌、東京
    • これらの曜日に
      • 月曜日
    • これらの時間に
      • 13
    • これらの分に
      • 0

[変数]変数を初期化する - ErrorConnections

無効な接続の情報を格納するための変数を定義します。

  • パラメーター
    • 名前
      • ErrorConnections
    • タイプ
      • 配列
    • 値
      • (未設定)

[Power Automate 管理] 自分の環境を一覧表示する

自分が利用可能な環境の一覧を取得します。

  • パラメーター
    • なし

[コントロール]それぞれに適用する

取得した各環境に対して処理を実行します。

  • パラメーター
    • 前のステップから出力を選択します
      • @{outputs('自分の環境の一覧表示')?['body/value']}

[Power Automate 管理]自分の接続の一覧表示

ループ中の環境に存在する接続情報を取得します。

  • パラメーター
    • 環境
      • @{items('それぞれに適用する')?['name']}

[データ操作]アレイのフィルター処理

先頭の status が Connected ではない接続のみを抽出します。

  • パラメーター
    • From
      • @{outputs('自分の接続の一覧表示')?['body/value']}
    • Filter Query
      • @{first(item()?['properties']?['statuses'])?['status']}
      • 異なる
      • Connected

[データ操作] 選択

Teams でのメッセージ出力に必要な項目を抽出します。

  • パラメーター
    • マップ
      • EnvironmentName
        • @{items('それぞれに適用する')?['properties']?['displayName']}
      • ConnectionName
        • @{item()?['properties']?['displayName']}
      • createdTime
        • @{item()?['properties']?['createdTime']}
      • lastModifiedTime
        • @{item()?['properties']?['lastModifiedTime']}
      • url
        • @{concat( 'https://make.preview.powerautomate.com/environments/', items('それぞれに適用する')?['name'], '/connections' ) }
      • status
        • @{first(item()?['properties']?['statuses'])?['status']}

[データ操作]作成 - ErrorConnections変数と選択結果を結合

union関数でErrorConnections変数と選択結果を結合します。

  • パラメーター
    • 入力
      • @{union( variables('ErrorConnections'), body('選択') )}

[変数]変数の設定

union関数で結合した値をErrorConnections変数に設定します。

  • パラメーター
    • 名前
      • ErrorConnections
    • 値
      • @{outputs('作成_-_ErrorConnections変数と選択結果を結合')}

[コントロール] 条件

ErrorConnections変数に格納されている接続の数で処理を分岐します。

  • パラメーター
    • Condition expression
      • かつ
        • @{length(variables('ErrorConnections'))}
        • より大きい
        • 0

Trueの場合

[データ操作]HTML テーブルの作成

Teams にメッセージを投稿するため、ErrorConnections 変数の内容を HTML テーブルに変換します。

  • パラメーター
    • From
      • @{variables('ErrorConnections')}

[Office 365 Users]マイ プロフィールの取得(V2)

Teams でメッセージを自分宛てに送信するため、自分のプロフィール情報を取得します。

  • パラメーター
    • なし

[Microsoft Teams] チャットまたはチャネルでメッセージを投稿する

Teams のチャットにメッセージを投稿します。

  • パラメーター

    • 投稿者
      • フローボット
    • 投稿先
      • フローボットとチャットする
    • Recipient
      • @{outputs('マイ_プロフィールの取得_(V2)')?['body/userPrincipalName']}
    • メッセージ
      • 無効な接続が見つかりました。必要に応じて再認証を行ってください @{body('HTML_テーブルの作成')}
  • 詳細パラメーター

    • IsAlert
      • はい

さいごに

定期的に接続の状態をチェックすることで、重要な接続に問題が発生した場合でも早期に検知できるようになります。

Power Automate クラウドフローでTeamsのチャネルを表示状態に変更する

1. はじめに

Microsoft Teams を使っていると、チームに多くのチャネルがあるのに、自分の画面には一部のチャネルしか表示されていない、という場面に出会うことがあります。これは、チャネルの「表示/非表示」がユーザーごとに管理されており、既定では最初のチャネル(一般)以外は非表示になっているためです。

新しくチームに参加したときなどは、重要なチャネルが非表示のままになっていることも多く、ひとつずつ手作業で表示状態に切り替えるのは少し面倒です。

そこで今回は、Power Automate のクラウドフローを使って、指定したチームのチャネルをまとめて表示状態に切り替える方法を紹介します。Microsoft Teams コネクタには「チャネルを表示状態にする」という直接的なアクションは用意されていませんが、ちょっとした工夫で実現できます。

2. 基本的な考え方

ポイントは、Teams の 「セクション」 という機能を利用することです。

セクションは、チャネルやチャットをグループ化して整理できる機能です。そして、セクションにチャネルを追加すると、そのチャネルは自動的に表示状態に切り替わる という挙動があります。この挙動を利用します。

具体的には、クラウドフローで次の操作を行います。

  1. ダミーセクションを作成する
  2. ダミーセクションに、表示状態にしたいチャネルを追加する(ここでチャネルが表示状態になる)
  3. ダミーセクションを削除する

セクションを削除しても、いったん表示状態になったチャネルはそのまま表示状態を維持します。そのため、見た目上はセクションを作る前と変わらない状態で、目的のチャネルだけが表示状態に切り替わる、という仕組みです。

ポイント:ETag(バージョン情報)の引き回し

セクションを操作するアクションでは、リクエストのたびに ETag(バージョン情報)を If-Match ヘッダーで渡す 必要があります。これは、複数の更新が衝突しないようにするための仕組みです。

やや厄介なのは、セクションを操作するたびにこの ETag が更新される という点です。そのため、操作ごとに最新の ETag を取得し、次の操作に引き継いでいく必要があります。今回のフローでは、変数 ETag を用意して、操作のたびに値を上書きしながら使い回しています。

このあたりが、このフローを組むうえで一番のポイントになります。 詳しくはこちらの記事で解説しています。

sasami-axis.hatenablog.com

3. サンプルフロー全体図

このフローは指定したチームのアクセスできるすべてのチャネルを表示状態にします。 フロー全体は次のような構成になります。

フローを手動でトリガーする
 └─ 変数を初期化する - ETag 
 └─ チャネルの一覧表示
 └─ List sections 
 └─ 変数の設定
 └─ Create a section
 └─ 変数の設定 1  
 └─ それぞれに適用する(チャネルの数だけ繰り返し)
     └─ Add an item to a section 
     └─ 変数の設定 2 
 └─ Delete a section 

4. フロー詳細解説

各アクションの設定内容を順番に見ていきます。

4-1. フローを手動でトリガーする

手動トリガー(ボタン)でフローを開始します。今回はシンプルに手動実行としていますが、後述の応用例のように、用途に応じてトリガーを変更することもできます。

4-2. [変数]変数を初期化する - ETag

ETag を保持するための変数を用意します。

設定項目 値
名前 ETag
種類 文字列
値 (空のまま)

以降のアクションで、この変数に最新の ETag を格納しながら使い回していきます。

4-3. [Microsoft Teams]チャネルの一覧表示

対象チームのチャネルの一覧を取得します。

設定項目 値
チーム 表示状態にしたいチームを指定

ここで取得したチャネルの一覧を、後続の「それぞれに適用する」で 1 件ずつ処理します。

4-4. [Microsoft Teams]List sections

対象チームの現在のセクション一覧を取得します(操作 ListSections)。

このアクションのレスポンスに含まれる @microsoft.graph.sectionsVersion が、最初の ETag として必要になります。

4-5. [変数]変数の設定

変数 ETag に、List sections で取得したバージョン情報を格納します。

ETag ← body('List_sections')?['@microsoft.graph.sectionsVersion']

4-6. [Microsoft Teams] Create a section(ダミーセクションの作成)

ダミーセクションを作成します。

設定項目 値
If-Match @variables('ETag')
Display Name @convertFromUtc(utcNow(),'Tokyo Standard Time','yyyyMMddHHmmss')
Is Expanded true
Sort Type nameAlphabetical

表示名には、他のセクションと名前が重複しないよう、実行時の日時(yyyyMMddHHmmss 形式)を利用しています。最終的に削除するため名前は何でも構いませんが、一意になるようにしておくと安心です。

4-7. [変数]変数の設定 1

セクションを作成すると ETag が変化するため、変数 ETag を作成後の値に更新します。

ETag ← outputs('Create_a_section')?['body/@odata.etag']

4-8. [コントロール]それぞれに適用する(Foreach)

「チャネルの一覧表示」で取得したチャネルの数だけ、次の処理を繰り返します。

繰り返しの対象:

outputs('チャネルの一覧表示')?['body/value']

4-8-1. [Microsoft Teams] Add an item to a section(チャネルをセクションに追加)

ダミーセクションにチャネルを追加します。この操作によって、対象のチャネルが表示状態に切り替わります。

設定項目 値
Section ID @outputs('Create_a_section')?['body/id']
ETag @variables('ETag')
Item ID @items('それぞれに適用する')?['id']

4-8-2. [変数]変数の設定 2

チャネルを追加するたびに ETag が変化するため、変数 ETag を最新の値に更新します。これを忘れると、次のループや最後の削除でエラーになります。

ETag ← outputs('Add_an_item_to_a_section')?['body/@odata.etag']

4-9. [Microsoft Teams] Delete a section(ダミーセクションの削除)

最後に、作成したダミーセクションを削除します(操作 DeleteSection)。

設定項目 値
Section ID @outputs('Create_a_section')?['body/id']
ETag @variables('ETag')

セクションを削除しても、すでに表示状態になったチャネルはそのまま残ります。これで、見た目はフロー実行前と同じまま、目的のチャネルだけが表示状態に切り替わった状態になります。

5.(応用)チームの新規メンバーがチャネルを表示するのに活用

ここまでのフローは、groupId に指定したチームのチャネルをまとめて表示状態にするものでした。これを応用すると、チームに新しく参加したメンバーが、自分の画面に全チャネルを一括表示する運用ができます。

ポイントは、チャネルの表示/非表示が フローを実行したユーザー(コネクタの接続アカウント)の画面に反映される ことです。そのため、新しく参加したメンバー自身にフローを実行してもらう必要があります。

具体的な運用案は次のとおりです。

5-1. フローの「実行のみのユーザー」に対象チームを追加する

新規メンバーがこのフローを実行できるよう、フローの 「実行のみのユーザー」 の設定に対象のチームを追加します。これで、チームのメンバーがフローを実行できるようになります。

5-2. フローの実行用 URL を組み立てる

フローの管理画面の URL の末尾にある /details を /run に置き換えた URL を作成します。

管理画面の URL:

https://make.powerautomate.com/environments/{環境id}/flows/{フローID}/details

実行用の URL(末尾を /run に置き換え):

https://make.powerautomate.com/environments/{環境id}/flows/{フローID}/run

5-3. 実行用 URL をチームの一般チャネルに投稿して案内する

組み立てた実行用 URL を、チームの 「一般(General)」チャネル に投稿し、新規メンバーには参加時に必ず実行するよう案内します。

これで、新しく参加した人は案内された URL を開いてフローを実行するだけで、自分の画面に全チャネルが表示状態になります。ひとつずつチャネルを表示する手間がなくなり、オンボーディングがスムーズになります。

5-4. 想定する使い方

こんなふうに使えるんじゃないかなというイメージです。

[1] チームに招待されたら一般チャネルの案内メッセージからフロー実行リンクをクリックします。

[2] 表示されたフローを実行します。

[3] フローが実行されました。

[4]Teamsに戻るとチャネルが表示されています!

6. 最後に

今回は、Power Automate のクラウドフローで Teams のチャネルを表示状態に変更する方法を紹介しました。

「セクションにチャネルを追加すると表示状態になる」という挙動を利用し、ダミーセクションの作成 → チャネルの追加 → セクションの削除、という流れで実現しました。ポイントは、セクション更新系アクションで ETag を適切に扱う ことです。

なお、今回のフローはシンプルにするためにあえて考慮していませんが、すでにセクションに追加済みの状態でさらにセクションに追加しようとするとエラーが発生します。今回の方法を応用する場合にはこれにも注意が必要です。

Power Automate クラウドフロー で Teams のセクションを操作する際に必要となる ETag の考え方

はじめに

Power Automate のクラウドフローで、Microsoft Teams の「セクション」を操作するアクションが使えるようになっていました。

セクションというのは、Teams の左側に並んでいるチャットやチャネル、会議などを、自分用のグループにまとめて整理できる機能です。「お気に入り」「プロジェクトA」といった自分だけのグループを作って、その中に関連するチャットを入れておく、というイメージです。このグループ分けを、フローで自動的に作ったり、名前を変えたり、中身を入れ替えたりできるのが今回のアクション群になります。

これらのアクションを触ってみたところ、作成・更新・削除といった「中身を変える」アクションでは ETag(エンティティタグ) という値が必要になります。本記事ではアクションの使い方は最小限にとどめて、ETag の考え方を中心にまとめておきます。

※本記事の内容は 2026 年 6 月時点で確認したものです。Teams のセクションを操作するアクションは比較的新しく、今後仕様が変わる可能性があります。

Microsoft Teams のセクションを操作するアクション

Microsoft Teams コネクタには、セクションを操作するアクションが 9 つ用意されています。役割でざっくり分けると、次のとおりです。

読み取り系アクション

アクション名 何をするアクションか
List sections 自分のセクションを一覧で取り出す
Get a section ID を指定して 1 つのセクションを取り出す
List section items セクションの中に入っている項目(チャット・チャネル・会議チャットなど)を一覧で取り出す

更新系アクション

アクション名 何をするアクションか
Create a section 新しいセクションを作る
Update a section セクションの名前や並び順などを変える
Delete a section セクションを削除する
Add an item to a section 項目をセクションに入れる
Remove an item from a section 項目をセクションから外す
Move a section item 項目を別のセクションへ移す

前提条件・制限事項

実際に試す前に、いくつか押さえておきたい点があります。

  • これらのアクションが操作できるのは 自分自身(サインインしているユーザー)のセクションです。他の人のセクションを並べ替える、といった使い方はできません。
  • システムが用意しているセクション(「チャット」「チームとチャネル」など、もともと用意されている枠)は、削除や名前の変更ができません。自由に作ったり消したりできるのは、自分で作ったセクションだけです。(システムが用意しているセクションでも "Is Expanded"は操作することができました。)

  • システムが用意しているセクションの表示名は予約されており、ユーザー定義セクションには使えません。具体的には以下の名前です。

    • RecentChats(既定のチャット)
    • QuickViews(クイック ビュー)
    • TeamsAndChannels(チームとチャネル)
    • MutedChats(ミュートしたチャット)
    • MeetingChats(会議チャット)
    • EngageCommunities(コミュニティ)

考え方:ETag とは?

ここからが本題です。更新系のアクションを使おうとすると、ETag という入力欄が出てきます。最初は「これは何を入れればいいの?」と戸惑うところなので、考え方を説明します。

下の図は、ETag の考え方を 1 枚にまとめたものです。

ETag は「今の状態を表す番号」

ETag は、ひとことで言うと 「セクションの今の状態を表す番号(バージョンの目印)」 です。

身近なもので例えると、書類の右上に「第 3 版」と書いてあるバージョン番号に近いものです。誰かがセクションの並びを変えるたびに、この番号は新しいものに切り替わります。

なぜこんな番号が必要かというと、「古い情報のまま、うっかり上書きしてしまう」事故を防ぐためです。

例えば、あなたがフローでセクションの名前を変えようとしている、ちょうどその裏で、別の端末から自分でセクションを並べ替えていたとします。このとき、フローが古い状態のまま処理を続けてしまうと、せっかくの並べ替えが消えてしまうかもしれません。そこで「あなたが見ている番号は、本当に今いちばん新しい番号ですか?」と確認するために使われるのが ETag です。番号が一致していれば実行され、古ければ「いったん止めてください」とエラーになります。

ETag が必要なアクション・不要なアクション

ETag が必要になるのは、中身を変える更新系のアクションだけです。読み取り系では必要ありません。

アクション ETag
読み取り系 取得 / 一覧 / 項目の一覧 不要
更新系 作成 / 更新 / 削除 / 項目の追加 / 項目の削除 / 項目の移動 必要

ETag はどこで手に入れるのか

では、その番号(ETag)はどこで手に入れるのでしょうか。答えは、セクションを操作する9つのアクションの結果に入っています。

つまり、流れとしてはとてもシンプルで、次の 3 ステップになります。

  1. 一覧(または取得)アクションで、今の ETag を受け取る
  2. その ETag を、更新系アクションの「ETag」欄に渡す
  3. 更新が実行される

ポイントは、更新系アクションを使う直前に、必ず一覧か取得で最新の ETag を取り直しておくことです。前日に取った番号を使い回す、といったことはできません(古い番号はエラーになります)。

よくあるエラー(412 / 428)

ETag まわりでつまずくと、だいたい次の 2 つのエラーに出会います。番号を見れば原因がわかるので、対処法とあわせて覚えておくと安心です。

エラー番号 意味(かんたんに言うと) 対処法
PreconditionFailed (statusCode:412) 渡した ETag が古い(その間にセクションが変わった) もう一度、一覧/取得で最新の ETag を取り直してから実行する
PreconditionRequired (statusCode:428) ETag を渡し忘れている(必要なのに空) 更新系アクションの ETag 欄に、一覧/取得で受け取った値を入れる

どちらも「番号がそろっていませんよ」というエラーです。その時点で最新のETagを取り直す**ところに戻れば、たいてい解決します。

サンプルフロー全体(セクション名を変える例)

考え方がわかったところで、いちばんシンプルな例として「自分で作ったセクションの名前を変える」フローを見てみます。ETag の流れがはっきりわかる、最小構成です。

1. 手動でフローをトリガーします(インスタント クラウド フロー)
        ↓
2. [Microsoft Teams] List sections
        ↓   ここで「今の ETag」を受け取る
3. [Microsoft Teams] Create a section
        ↓   ・新しい名前
            ・ETag ← 手順 2 の出力に含まれるETagの値を渡す
4. [Microsoft Teams] Update a section
            ・対象セクションの ID
            ・新しい名前
            ・ETag ← 手順 3 の出力に含まれるETagの値を渡す

フロー解説

1. [Microsoft Teams] List sections

まず「List sections」アクションを置きます。特別な入力は不要で、実行すると自分のセクションの一覧と、今の ETag(バージョン) が返ってきます。

この後の更新で使うのは、この結果に含まれる ETag の値です。

2. [Microsoft Teams] Create a section

次に「Create a section」アクションを置き、下記のように設定します。

入力欄 入れる値
ETag 手順 1 の一覧アクションで受け取った ETag
@body('List_sections')?['@microsoft.graph.sectionsVersion']
DisplayName 変更後の新しい名前

3. [Microsoft Teams] Update a section

次に「Update a section」アクションを置き、次のように設定します。

入力欄 入れる値
Section ID 名前を変えたいセクションの ID
ETag 手順 2 の一覧アクションで受け取った ETag
@{outputs('Create_a_section')?['body/@odata.etag']}
Display Name 変更後の新しい名前

ここで ETag を入れ忘れると 428、古い値が入っていると 412 のエラーになります。手順 2 の直後に手順 3 を置き、そのときの最新の ETag をそのまま渡すのが基本の形です。

これで、フローを実行すると目視はできませんが、セクションが作成されすぐにセクションの名前が変わります。削除や、項目の追加・移動なども、考え方は同じです。「セクション系アクションでETag を取得する → 更新系アクションに渡す」 という流れを覚えておけば、どのアクションにも応用できます。

複数の更新をまとめて行うときの注意点

最後に、少しだけ応用の注意点です。

ETag は 「セクション全体の今のバージョン」 をあらわしています。そのため、1 回更新するたびに番号が新しく切り替わります。

ということは、たとえば「3 つのセクションを続けて更新する」といったフローで、最初に 1 回だけ取った ETag を 3 回とも使い回すと、2 回目以降は番号が古くなっていて 412 エラーになってしまいます。

複数の更新を続けて行う場合は、更新するたびに、その直前で一覧(または取得)アクションを実行して ETag を取り直すようにしてください。少し手間に見えますが、これが事故なく確実に処理するためのコツです。

さいごに

今回は、Power Automate クラウドフローで Teams のセクションを操作する際に必要となる ETag について、考え方を中心にまとめました。 調べてみるとセクション系アクションの元となるGraph APIは未だbetaのため、これらの仕様も今後変更されるかもしれません。

ETag は最初こそ取っつきにくい言葉ですが、「今の状態を表す番号。更新するときは最新のものを渡す」 とだけ押さえておけば、難しいものではありません。エラーが出ても、番号(412/428)を見て一覧で取り直せば、たいてい解決します。

参考情報

Power Automate クラウドフロー だけでMicrosoft 365 に関する質問に答えるボット的なものを作る【超簡単】【Microsoft 365 Self-Help コネクタを検証してみた】💎

はじめに

Power Automate クラウドフローだけで、Microsoft 365 に関する質問に答えてくれるチャットボット的なものを作る方法です。

Microsoft 365 Copilot も Copilot Studio も AI Builder も使わずに、自前でナレッジベースやFAQを準備することなく、Teams のチャネル上で動くかんたんな質問応答ボットを作ることができます。クラウドフロー1本だけで完結します。

この記事の内容は、プレミアムコネクタを利用します。Power Automate Premium  等のライセンスが必要になります。

Microsoft 365 Self-Help コネクタとは

このフローは「Microsoft 365 Self-Help コネクタ」を使用してみたサンプルフローです。

Microsoft 365 Self-Help コネクタは、Microsoft 365 製品に関する問題のセルフヘルプ ソリューションを返してくれるコネクタです。

この記事を投稿した2026年6月時点ではこのコネクタは"プレビュー"となっています。正式リリース前のものであるため、仕様変更・廃止などの可能性があります。

▪️どんなコネクタ?

  • ユーザーの自然言語の質問に対する解決策を生成AIで返してくれます。
  • Microsoft サポートが利用しているのと同じ仕組みを使えるとのことです。(リファレンスページの説明より。真偽不明)

▪️「Get self-help insights」アクション

今回使うのは「Get Self-help insights)」という1つのアクションだけです。

  • 入力:ユーザー クエリ テキスト(Text)… ユーザーの質問文を文字列で渡します。
  • 出力:GPTInsight … 渡したクエリに対する GPT の回答(分析情報)が返ってきます。

この GPTInsight をそのまま Teams に投稿するだけで、質問応答ボットのできあがりです。

learn.microsoft.com

▪️利用できる製品・前提条件

このコネクタは Premium コネクタであるため、Power Automate Premium などのライセンスが必要になります。

動作イメージ

作成したフローを動作させてみると、このような応答が返ってきます。

また、「Microsoft 365 Self-help」という名前ですが、Windows や Surface に関する質問にも回答しました。

長すぎず短すぎず、簡潔な応答が返されていることがわかります。

サンプルフロー全体図

フローはとてもシンプルで、次の4ステップだけです。

  1. [Microsoft Teams]チャネルに新しいメッセージが追加されたとき(トリガー)
  2. [Content Conversion]HTML をテキストに変換する
  3. [Microsoft 365 Self-Help]Get self-help insights
  4. [Microsoft Teams]チャネル内のメッセージで応答します

変数も条件分岐もありません。これだけです。

事前準備として、Teams にボット用のチャネルを1つ作成しておきます。 今回は「M365Self-Help」というチャネルを使っています。

フロー詳細解説

▪️1. チャネルに新しいメッセージが追加されたとき

事前に作成したチャネル(M365Self-Help)を指定します。このチャネルに新しいメッセージが投稿されると、フローが動き出します。ユーザーはこのチャネルに質問を書き込む、という想定です。

  • パラメーター
    • チーム
      • 事前準備でチャネルを作成したチーム
    • チャネル
      • 事前準備で作成したチャネル

▪️2. HTML をテキストに変換する

Teams の投稿メッセージ本文は HTML 形式で渡ってきます。そのままだとタグが混ざってしまうため、「コンテンツの変換」コネクタの「HTML をテキストに変換する」アクションでプレーンテキストに変換します。

  • パラメーター
    • コンテンツ
      • トリガーの「本文(Body)」
      • @{triggerOutputs()?['body/body/content']}

▪️3. Get self-help insights

変換したプレーンテキストを、Microsoft 365 Self-Help コネクタの「セルフヘルプの分析情報を取得する」アクションのクエリとして渡します。

  • パラメーター
    • User Query Text
      • 手順2の出力(プレーンテキスト)
      • @{body('Html_からテキスト')}

▪️4. チャネル内のメッセージで応答します

最後に、取得した回答をトリガーとなったメッセージへの返信として投稿します。

  • パラメーター
    • 投稿者
      • Flow bot
    • 投稿先
      • チャネル
    • メッセージ ID
      • トリガーの「メッセージ ID」
      • @{triggerOutputs()?['body/id']}
    • チーム/チャネル
      • 質問が投稿されたチーム・チャネル
    • メッセージ
      • 手順3の出力「GPTInsight」
      • 応答にはHTMLが含まれるので、コードビューに切り替えてHTMLを整えておくことをお勧めします。
      • <p class="editor-paragraph"><br>@{outputs('Get_self-help_insights')?['body/AIInsights/GPTInsight']}</p><br>

「メッセージ ID」にトリガーのメッセージ ID を指定することで、質問への返信(スレッド)として回答が付くようになります。

さいごに

Power Automate クラウドフロー1本だけで、Microsoft 365 の質問に答えるボット的なものを作ることができました。

ナレッジの準備が一切不要で、コネクタが返してくれる GPTInsight を投稿するだけ、というお手軽さが魅力です。社内のちょっとしたヘルプデスク窓口や、自分用の M365 お助けボットとして遊んでみるのも面白いかもしれません。

ただし、今回のサンプルフローは、即時の応答ができないことが難点です。これは、今回のフローが「チャネルに新しいメッセージが追加されたとき」トリガーの動作(ライセンスにより 1分~15分程度の間隔で定期実行)に依存しているためです。本格的に業務利用する場合は、Power Apps のアプリからこのコネクタを利用する等実装方法を検討するのが良さそうです。

また、回答は Microsoft のサポート記事ベースなので、自社固有の手順やルールには答えられない点には注意が必要です。そういった用途には Copilot Studio 等を検討するのが良さそうです。

Power Automate クラウドフローでPlanner のタスク チャットを取得・投稿する💎

 

はじめに

Power Automate クラウドフローでPlanner のタスクチャットを取得・投稿する方法です。

この記事の内容は、プレミアムコネクタを利用します。Power Automate Premium  等のライセンスが必要になります。

 

 

▪️タスク チャットとは

従来の「コメント機能」に代わって導入された “タスク専用のチャット機能” で、タスクごとに 1 つのチャットスレッドを持ち、メンション・編集・削除などモダンなチャット体験ができる仕組みです。

タスクチャットと以前のコメント機能の違い

タスクチャットと旧コメント機能は互換性のない別の機能です。

項目 タスク チャット 旧コメント
通知 @メンションされた人だけ通知 プランの M365 グループ全員に通知
編集/削除 可能 不可

 

support.microsoft.com

 

▪️タスクチャットを投稿する

考え方

Power Automate のPlanner コネクタにはタスクチャットを投稿するアクションは用意されていませんが、Graph APIを呼び出すことで投稿することが可能です。

Graph API の「Create plannerTaskChatMessage」エンドポイントを利用します。

learn.microsoft.com

 

この記事を投稿した2026年5月時点ではこれらのタスクチャット関連のAPIは"beta"となっています。正式リリース前のものであるため、仕様変更・廃止などの可能性があります。

 

フロー全体



 

フロー解説

1.Planner のタスクのIdを取得

Planner コネクタの各種アクションなどを用いて、対象となる Planner タスクの ID を取得します。

 

2.[HTTP with Microsoft Entra ID (事前承認)] HTTP 要求を呼び出します- create Task Message

タスクメッセージを作成します。

  • 方法
    • POST
  • 要求のURL
  • 要求の本文
    • {
        "content":"ここにメッセージを記述(HTML可)"
      }
    • プレーンテキストの他にHTMLがサポートされているようです。
    • メンションを含むメッセージを記述することもできます。
    • {
        "content":"<div><span itemid=\"0\"
      itemtype=\"https://schema.skype.com/Mention/Person\">
      </span>ここにメッセージを記述(HTML可)</div>",

      "mentions":[ { "mentioned": "メンションするユーザーID(GUID)", "position":0,
      "mentionType": "user"
         
      } ] }

 


 

▪️タスクチャットを取得する

考え方

Power Automate のPlanner コネクタにはタスクチャットを取得するアクションは用意されていませんが、Graph APIを呼び出すことで取得することが可能です。

Graph API の「List messages」エンドポイントを利用します。

learn.microsoft.com

 

この記事を投稿した2026年5月時点ではこれらのタスクチャット関連のAPIは"beta"となっています。正式リリース前のものであるため、仕様変更・廃止などの可能性があります。

 

フロー全体

フロー解説

1.Planner のタスクのIdを取得

Planner コネクタの各種アクションなどを用いて、対象となる Planner タスクの ID を取得します。

 

2.[HTTP with Microsoft Entra ID (事前承認)] HTTP 要求を呼び出します- list Task Messages

タスクメッセージを取得します。

  • 方法
    • GET
  • 要求のURL
    • https://graph.microsoft.com/beta/planner/tasks/{タスクid}/messages

下記のようなJSONで取得されます。

削除済みのメッセージもこのように情報が残っていることが確認できます。


[注意点] タスクチャットがないタスクではNotFoundエラーが発生する

タスクチャットが未投稿のタスクに対して実行すると、404エラーが発生します。

 

さいごに

この記事の内容は Planner の Basic プランで動作を確認しています。

とある目的のフローを作成する際に確認した内容を備忘録的にまとめてみました。
現時点では beta の為本格的な利用は避けるべきですが、正式リリース後は便利に使えそうで期待しています。

 

[blog:g:4207112889948320640:banner]

[blog:g:11696248318754550877:banner]