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

ささみ学習帳

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

Power Automate クラウドフローでOutlook イベントを転送する

 

はじめに

Power Automate クラウドフローでOutlook のイベントを転送する方法です。

 

考え方

Power Automate のOffice 365 Outlook コネクタにはイベントを転送するアクションは用意されていませんが「HTTP 要求を送信します」アクションを使ってGraph APIを呼び出すことで作成することが可能です。

Graph API の「event: forward」エンドポイントを利用します。

learn.microsoft.com

 

 

フロー全体

 

フロー解説

1.[Control]スコープ - デフォルトカレンダーを取得

なんらかの手段で転送したいイベントのidを取得します。サンプルフローでは単純に「イベントの取得(V4)」アクションで取得した先頭のイベントのidを取得しているだけなので説明は省略します。

 

2.[Office 365 Outlook] HTTP 要求を送信します-イベントの転送

イベントの転送を行います。

  • URI
  • メソッド
    • POST
  • 本文
    • {
        "ToRecipients":[
            {
              "EmailAddress": {
                "Address":"転送先メールアドレス"
              }
            }
           ],
        "Comment": "コメント(省略可能)"
      }
    • 複数の転送先を指定することも可能です。
    • {
        "ToRecipients":[
            {
              "EmailAddress": {
                "Address":"転送先メールアドレス"
             }
            },
            {
              "EmailAddress": {
                "Address":"転送先メールアドレス"
              }
            }
           ],
        "Comment": "コメント(省略可能)"
      }
  • コンテンツの種類
    • application/json

 

さいごに

とある目的のフローを作成する際に確認した内容を備忘録的にまとめてみました。

 

 

Power Automate クラウドフローで OneDrive for Business に新しいフォルダを作成する

はじめに

OneDrive for Business コネクタには単純にフォルダーを作成するアクションがありません。(2026年3月現在)

そこで代わりの手段を調べて見ました。

[手段1] 「ファイルの作成」アクションを使う

OneDrive for Business コネクタの「ファイルの作成」「パスを使用したファイルのコピー」「ファイルのコピー」といったアクションは、ファイルの作成先・コピー先に存在しないフォルダパスを指定するとそのフォルダを作成してファイルを作成する動作をします。これを利用してダミーのファイルを作成する操作でフォルダを作成し、そのあとでダミーファイルを削除します。

フロー全体

アクション詳細

1. 「ファイルの作成」アクション

ダミーファイルとともにフォルダを作成します。

パラメータ

  • フォルダーのパス
    • 作成するフォルダーのパス
    • 例: /newfolder
    • 例: /Temp/newfolder/newfolder/newfolder というようにフォルダ階層を作成することもできる
  • ファイル名
    • 使用禁止文字でなければなんでもOK
  • ファイルコンテンツ
    • 0 1文字でok

2.ファイルの削除

ダミーファイルを削除します。

パラメータ

  • ファイル
    • @outputs('ファイルの作成')?['body/Id']

[手段2] SharePoint コネクタの「新しいフォルダーの作成」アクションを使う

OneDrive for Business は内部的にはSharePointと同じ仕組みで動作していると言います。そこでSharePointコネクタの「新しいフォルダーの作成」アクションを使用してフォルダーの作成ができること確認しました。

アクション詳細

パラメータ

  • サイトのアドレス
  • 一覧またはライブラリ
    • ドキュメント
    • ※カスタム値として"ドキュメント"と入力します
    • ※ユーザーの言語設定に依存します 英語のユーザーの場合は"Documents"でした
  • フォルダーのパス
    • 作成するフォルダーのパス
    • 例: /newfolder
    • 例: /Temp/newfolder/newfolder/newfolder というようにフォルダ階層を作成することもできる

参考

OneDrvieの詳細ペインのパスで、直接リンクをコピーすることで簡単にサイトアドレスを確認できます。

さいごに

どちらの手段でも問題なく作成することはできますが、手段1の方が簡単でシンプルかもしれません。

Power Automate クラウドフローでOneNoteにタイトル付きでページを作成する

はじめに

OneNote(Business)コネクタの備忘録的まとめです。 クラウドフローでOneNoteにタイトル付きでページを作成する方法について解説します。

タイトルを指定してページを作成するポイント

ページを作成するアクションにタイトルのパラメータはありません。

一見するとページタイトルを設定できないように思えますが、OneNote(Business)コネクタのページの既知の問題と制限事項には次のように書かれています。

コネクタは現在、ページの作成アクションの明示的な入力パラメーター Page Title をサポートしていません。これは、OneNote API の実装に起因する制限です。ただし、タイトルは、<title></title> タグを使用して HTML のページ コンテンツの一部として指定できます。

しかし、単に <title>タイトル文字列</title> とページコンテンツ内に記述しただけでは、タイトルは設定されません。
タイトルを設定するには次の3つのポイントがあります。

  • コードビューで記述する必要がある
  • HTMLの構造を記述する必要がある
  • クラシックデザイナーで保存する必要がある

1.コードビューで記述する必要がある

ページコンテンツの入力エリアは、右端の</>アイコンをクリックすることでHTMLビューとコードビューを切り替えることができます。 HTMLコードはコードビューで入力する必要があります。

2.HTMLの構造を記述する必要がある

OneNote(Business)コネクタのページの既知の問題と制限事項を読むと、ただ単に<title>タイトル文字列</title>と書けば良いとも読み取れますが、それではタイトルが設定されません。 タイトルを認識させるには正しいHTML構造を記述する必要があります。

タイトルの設定が確認できた最小限のHTML構造は下記のようになります。

<html>
<head>
<title>タイトル</title>
</head>
<body>
<p class="editor-paragraph">テストです。</p>
</body>
</html>

※<body></body>タグの間にページコンテンツを記述します。

3.クラシックデザイナーでフローを保存する必要がある

2026年3月時点で検証した結果では、新しいデザイナーで保存したフローではページタイトルは設定できませんでした。 必ずクラシックデザイナーでフローを保存する必要があります。

【余談】「クイックノートにページを作成」アクションはページのゴミが出力される問題がある

OneNote(Business)コネクタには「セクションにページを作成」と「クイックノートにページを作成」の2つのアクションがありますが、どちらでも前述の3つのポイントは有効です。 ただし、「クイックノートにページを作成」アクションでは、コードビューで指定すると余分なダブルクォーテーションが出力されたり、改行が ¥n と文字として出力される不具合があるようです。 不具合が解消されるまでは、クイックノートでも「セクションにページを作成」アクションを利用した方が安全です。

【余談】ページの更新でタイトルを指定することも可能

「ページのコンテンツの更新」アクションでも、既存ページのタイトルを更新することができます。

「新しいデザイナーが使いたい」「HTMLを書くのが面倒」という場合は、このの方法も有効です。

遅延アクションで1秒待つことをおすすめ

ページの作成直後に「ページコンテンツの更新」アクションを実行するとエラーが発生する場合があります。 ページの作成アクションが実行完了してもページの作成にやや時間がかかるためです。 そのため、ページの作成アクションと更新アクションの間に「遅延」アクションを挿入し、1秒待機させることで安定して動作します。

参考情報

learn.microsoft.com

sasami-axis.hatenablog.com

sasami-axis.hatenablog.com

Power Automate クラウドフローでOneNoteのページを更新する際に出来ること

はじめに

少し間が空いてしまいましたが、前回の記事の続きになります 👇

sasami-axis.hatenablog.com

今回は OneNote(Business) コネクタの「ページのコンテンツの更新」アクション について調べた内容を備忘録としてまとめました。

「ページコンテンツの更新」アクションは少し複雑

「ページコンテンツの更新」アクションは、パラメータ構成がやや複雑です。これは Graph API のページ更新エンドポイント仕様をほぼそのまま反映しているためです。

設定パラメータの解説

ターゲット

更新対象の要素を指定します。指定できるのは次の4種類です。

識別子 概要
#data-id OneNoteページのHTML内で定義された data-id を指定します。ページ先頭のdivには自動的に「_default」という data-id が付与されます。その他の data-id は確認できませんでした。

上図の場合は「#_default」と指定します。このターゲットでは append / prepend / replace アクションが利用可能です。
ID 実質利用不可。
OneNote(Business)コネクタはID指定更新に対応していますが、指定すべきIDを取得する手段が用意されていません。
Graph APIを利用することでID情報を取得できます。ただしGraph APIが使える環境であれば、そちらで直接更新した方が効率的です。
body ページ上で最初の div をターゲットにします。「#」をつけず "body" とだけ記述します。このターゲットでは append / prepend アクションのみ利用できます。
title ページタイトルをターゲットにします。「#」をつけず "title" とだけ記述します。このターゲットでは replace アクションのみサポートされます。

OneNote(Business) コネクタ単体ではページ内要素のIDを取得できない ため、ID指定は実用的ではありません。

そのため、実際にできるのは以下の2点に限られます。

  • ページ先頭の div 要素への追加・置換
  • ページタイトルの更新

アクション

ターゲット要素に対して実行するアクションを指定します。指定できるのは以下の4種類です。

アクション 概要
append 指定したコンテンツを最後の子要素として追加します。
(body、div、ol、ul 要素のみ対応)
insert ターゲットの前後に要素を追加します。位置は「場所」パラメータで指定します。
prepend 指定コンテンツを最初の子要素として追加します。
(body、div、ol、ul 要素のみ対応)
replace ターゲット要素を指定コンテンツで置き換えます。

参考:サポートされる要素とアクション


場所(ポジション)

ターゲットを基準に、コンテンツを追加する位置を指定します。省略した場合、既定値は after です。

位置 概要
after append 時: ターゲット要素の最後の子として追加。
insert 時: ターゲット要素の後ろに並列追加。
before append 時: ターゲット要素の最初の子として追加。
insert 時: ターゲット要素の前に並列追加。

コンテンツ

更新するコンテンツ(HTML形式)を指定します。テキストや画像の埋め込みなどが可能です。


設定例

ページ(先頭のdiv要素)にテキストを追加

シンプルにテキストを追加する例です。

  • ターゲット
    • #_default または body
  • アクション
    • prepend または append(追加位置によって変化)
  • 場所
    • after
  • コンテンツ
    • <p>これはテストです</p>


ページ(先頭のdiv要素)に画像を追加

テキストだけでなく画像を埋め込むことも可能です。

OneDrive 上にある画像ファイルを取得し、dataUri 関数で変換したデータを <img> タグで組み込みます。

  • ターゲット
    • #_default または body
  • アクション
    • prepend または append
  • 場所
    • after
  • コンテンツ
    • <p><img src="@{dataUri(body('パスによるファイル_コンテンツの取得'))}"></p>


ページタイトルを変更

ページタイトルを置換する設定例です。

  • ターゲット
    • title
  • アクション
    • replace
  • 場所
    • after
  • コンテンツ
    • 新しいタイトル


参考にしたページ

この内容は主に以下のドキュメントを参考にしています。

learn.microsoft.com

learn.microsoft.com

learn.microsoft.com

Teams ライブチャットを試してみた

Teams ライブチャットとは

Teams ライブチャットは、Webサイトの訪問者がサイト上のチャットウィジェットから問い合わせを送信し、そのやり取りが直接 Microsoft Teams のサポート側に届いてリアルタイムで対応できる仕組みです。現時点では有人チャットのみのようですが、今後Copilot Studio で作成したチャットボットと連携の予定もあるようです。

前提条件・制限事項

  • Microsoft 365 Business Basic、Microsoft 365 Business Standard、Microsoft 365 Business Premiumのユーザーのみが利用可能
  • セットアップを行う管理者がビジネスライセンスを持っている必要がある
  • サポートチームに参加できるのは最大25人まで

使ってみた

問い合わせ対応の流れ

本来はチャットウィジットをWebサイトに配置して使うものですが、今回はテスト画面で動作を確認してみました。 Webサイト側のチャットウィジットで問い合わせメッセージを入力してみます。 すると名前を求められるので名前を入力します。 続いて連絡手段を選択します。ここではメールを選択します。 メールアドレスを求められるので入力します。 ※2分以内?にサポートチームの応答がない場合は、チャットは終了します。

サポートチーム側では、Teamsの新規チャットで通知されます。 そのチャットを開くとカードで問い合わせの内容が表示されています。とりあえず応答してみました。 Teams側で応答したメッセージがリアルタイムで、Webサイトのチャットウィジットに表示されます。

対応完了したら、ステータスを「終了」に変更します。 するとチャットからサポートメンバーが削除され読み取り専用になります。 Webサイトのチャットウィジット側にもチャットが終了したと表示されます。

…と、このような形でTeamsチャットでやり取りしているかのように、Webサイトの訪問者とチャットコミュニケーションが取れる仕組みになっているようです。

問い合わせの管理

ライブチャットを設定すると、Teams に「ライブチャット リクエスト」というチームが作成されます。 このチームの一般チャネル上で問い合わせの管理を行います。 一般チャネルには、問い合わせがあるたびにカードが投稿されます。

  • トランスクリプトの表示
    • チャットログの表示することができます
  • 再割り当て
    • サポート担当者を変更することができます
  • 状態の更新
    • 問い合わせのステータスを設定することができます
      • フォローアップ:チャットで解決できなかった案件はフォローアップとし、電話・またはメールでフォローを行う
      • 終了:問い合わせ完了

対応が終了したカードの場合は「トランスクリプトの表示」のみ操作可能となります。

「要求」タブには Lists で問い合わせが管理されています。

さいごに

Teams ライブチャットの流れを確認してみました。

Teams を使ってWebサイトのウィジットとリアルタイムのチャットが行えること、Lists で問い合わせのステータス管理が行われていることを確認することができました。

Microsoft 365 Business ライセンスのみに提供されている機能ということもありますが、中小企業で自社Webサイトでチャットサポートを行いたい場合にはとても手軽に、学習コストも低く導入できそうです。

次回は、Teamsライブチャットのセットアップについて解説したいと思います。

参考情報

learn.microsoft.com

Teamsで今開いているチャットと同じメンバーで新規チャットを開始するPower Automate クラウドフロー【暫定版Ver.2】

はじめに

この記事は「Microsoft Power Automate Advent Calendar 2025」に参加しています。

シリーズ2 - 16日目の記事です。

このフローの目的

Microsoft Teams でチャットを使っている際の不便を軽減することを目的としたフローです。 今開いているチャットのメンバー情報をコピーして新規チャットを作成します。

気ままに勉強会 #131でお話しさせていただいたフローの詳細記事です。

sasami-axis.hatenablog.com

動作イメージ

フロー全体

フロー解説

1.[Microsoft Teams] 作成ボックスから(V2)

チャットの入力ボックスからフローを実行するためにこのトリガーを使用します。

{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "Input.Text",
            "placeholder": "チャットの名前を入力",
            "label": "チャット名",
            "isRequired": true,
            "id": "name",
            "errorMessage": "チャット名は必須です。"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.3"
}

2.[変数]変数を初期化する - メンバーリスト

現在のチャットのメンバーリストを格納する変数を初期化します。

  • パラメーター
    • 名前
      • メンバーリスト
    • タイプ
      • 配列
    • 値
      • (未設定)

3.[コントロール]スコープ-メンバーリストを作成

3-1.[コントロール]条件-呼び出し元がチャットかチャネルかで分岐

呼び出し元がチャットかチャネルかで処理を分岐します。teamsFlowRunContext/ChannelData/Team/AadGroupId の値が無ければチャットからの呼び出しと判断しています。

  • パラメーター
    • Condition expression
      • かつ
        • empty(triggerBody()?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId'])
        • 等しい
        • true

3-1-1. true:チャットの場合

3-1-1-1. [Microsoft Teams]メンバーリストを作成

チャットのメンバーリストを取得します。

  • パラメーター
    • スレッドの種類
      • グループチャット
    • グループチャット
      • @{triggerBody()?['teamsFlowRunContext']?['conversation']?['id']}

3-1-1-2.[変数]変数の設定 - メンバーリスト

メンバーリストを変数に格納します。

  • パラメーター
    • 名前
      • メンバーリスト
    • 値
      • @{outputs('メンバーリストを作成-_chat')?['body/value']}

3-1-2. false:チャネルの場合

3-1-2-1.[Microsoft Teams]メンバーリストを作成 - channel

チャネルのメンバーリストを取得します。

  • パラメーター
    • スレッドの種類
      • チャネル
    • チーム
      • @{triggerBody()?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']}
    • チャネル
      • @{triggerBody()?['teamsFlowRunContext']?['channelData']?['channel']?['id']}

3-1-1-2.[変数]変数の設定 - メンバーリスト2

メンバーリストを変数に格納します。

  • パラメーター
    • 名前
      • メンバーリスト
    • 値
      • @{outputs('メンバーリストを作成-_channel')?['body/value']}

4.[コントロール]スコープ-チャットを作成

4-1.[Office 365 ユーザー]マイ プロフィールの取得 (V2)

フロー実行ユーザーのプロフィールを取得します。

  • パラメーターなし

4-2.[データ操作]アレイのフィルター処理-自分以外

メンバーリストからフロー実行ユーザーを除外します。

  • パラメーター
    • From
      • @{variables('メンバーリスト')}
    • Filter Query
      • @{item()?['userId']}
      • 異なる
      • @{outputs('マイプロフィールの取得(V2)')?['body/id']}

4-3.[データ操作]選択

ユーザーIdのみの配列を作成します。

  • パラメーター
    • 元 -@{body('アレイのフィルター処理-自分以外')} -マップ -@{item()?['userId']}

4-4.[データ操作]結合

4-3の配列の要素を結合し、セミコロン区切りのユーザーId文字列を作成します。

  • パラメーター
    • 元
      • @{body('選択')}
    • 次と結合する
      • ;

4-5.[コントロール]スイッチ - メンバー数

メンバー数で処理を分岐します。

  • パラメーター
    • オン
      • Length(variables('メンバーリスト'))

4-5-1.Case - 1人

メンバーが1人の場合=自分1人チャット・自分1人チーム

4-5-1-1.[Microsoft Teams]Teams のタスク モジュールで応答 - メンバーが自分一人

メンバー1人のチャットは作成できないためメッセージを表示して終了します。

{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.4",
    "body": [
        {
            "type": "TextBlock",
            "text": "現在のチャット/チャネルのメンバーが2人以上である必要があります。",
            "wrap": true,
            "weight": "Bolder"
        }
    ],
    "targetWidth": "Wide"
}

4-5-2.Case - 2人

メンバーが2人の場合=1対1チャット・2人チーム 2名+ダミーユーザーでグループチャットを作成します

4-5-2-1.[Office 365 ユーザー]ユーザー プロフィールの取得 (V2) - ダミーユーザー

ダミーユーザーのプロフィールを取得します。

  • パラメーター
    • ユーザー(UPN)
      • 追加するユーザーのUPN
      • リソースなど通常追加しないユーザーを追加します。

4-5-2-2.[Microsoft Teams]チャットの作成 - 1対1チャットがソース?

チャットを作成します。

  • パラメーター
    • 追加するメンバー
      • @{body('結合')};@{outputs('ユーザープロフィールの取得(V2)-ダミーユーザー')?['body/id']}
    • タイトル
      • @{triggerBody()?['cardOutputs']?['name']}

4-5-2-3.[Microsoft Teams]Teams のタスク モジュールで応答 - 1対1チャットがソース

メッセージを表示します。

{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.4",
    "body": [
        {
            "type": "TextBlock",
            "text": "新しいチャットを作成しました。",
            "wrap": true,
            "weight": "Bolder"
        },
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "@{triggerBody()?['cardOutputs']?['name']}"
        },
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "【重要】新規チャットにはダミーユーザー「xxxx@xxxxxxx.com」がメンバー追加されています。\n利用開始する前にダミーユーザーを削除してください。"
        },
        {
            "type": "ActionSet",
            "actions": [
                {
                    "type": "Action.OpenUrl",
                    "title": "開く",
                    "url": "https://teams.microsoft.com/l/chat/@{outputs('チャットの作成_-_1対1チャットがソース?')?['body/id']}/conversations"
                }
            ]
        }
    ],
    "targetWidth": "Wide"
}

4-5-3.既定

メンバーが3人以上の場合

4-5-3-1.[Microsoft Teams]チャットの作成

チャットを作成します。

  • パラメーター
    • 追加するメンバー
      • @{body('結合')}
    • タイトル
      • @{triggerBody()?['cardOutputs']?['name']}

4-5-3-2.[Microsoft Teams]Teams のタスク モジュールで応答 - 1対1チャットがソース

メッセージを表示します。

{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.4",
    "body": [
        {
            "type": "TextBlock",
            "text": "新しいチャットを作成しました。",
            "wrap": true,
            "weight": "Bolder"
        },
        {
            "type": "TextBlock",
            "wrap": true,
            "text": "@{triggerBody()?['cardOutputs']?['name']}"
        },
        {
            "type": "ActionSet",
            "actions": [
                {
                    "type": "Action.OpenUrl",
                    "title": "開く",
                    "url": "https://teams.microsoft.com/l/chat/@{outputs('チャットの作成')?['body/id']}/conversations"
                }
            ]
        }
    ],
    "targetWidth": "Wide"
}

課題・制限事項

メンバー最大20人まで

今回のフローでは、Microsoft Teams コネクタの チャットを作成するアクションを使ってチャットを作成しています。 このアクションには、メンバー最大20人までしかチャットを作成できないという制限があります。

実際に21人以上のチャットを作成しようとすると下記エラーが発生します。

この制限への対処方法は検討中です。

コピー元に指定できない

下記のものは作成ボックスからワークフローを表示することができないため、今回のフローを呼び出すことができません。

  • 1人チャット
  • 共有チャネル
  • プライベートチャネル

さいごに

今回のフローは、以前作成した「Teamsで今開いているチャットと同じメンバーで新規チャットを開始するPower Automate クラウドフロー【暫定版】」の改良版でもあります。

主な改良点は下記の3点です。

  • チャットだけでなくチャネルをソースにできるように変更
  • メンバーが3人以上の場合はダミーユーザーを追加しないように変更
  • メンバーが1人の場合にエラー処理を追加

「気ままに勉強会 #131 気ままになんでもLT会~第10回~」登壇資料を公開しました

 

「気ままに勉強会 #131 気ままになんでもLT会~第10回~」で登壇させていただきました

kimamani.connpass.com

 

登壇資料

www.docswell.com

とても良い経験をさせていただいた運営の皆様、参加者の皆様に感謝です。