Power Automateで毎日スケジュール案内してもらった！ エクセルからなので超楽々 !

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/ff64663a-f92f-32e1-deb8-4a3ee869a86b.png)
## 当日朝にスケジュールを知らせてくれる便利ツール完成しました。（SharePoint Excel連携しています）
自グループは弊社内の会議室予約スケジュールを統一のクラウドSharePointのエクセルで管理しています。
「重要な業務スケジュールのみ前日に個人メールへ知らせてくれるツールを開発できればよいな」と思い**Power Automate**で作成してみました。
スケジュール名・開始時間・会場を自動メールで知らせてくれます。
実際にスケジュールの当日8時にスマホ(自分の場合はiPhone)に自動送信されるメールはこんな感じです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Power Automateでスケジュールを毎朝自動配信してもらった！ SharePoint Excelからなのでめっちゃ便利<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/PowerAutomate?src=hash&amp;ref_src=twsrc%5Etfw">#PowerAutomate</a> <a href="https://twitter.com/hashtag/SharePoint?src=hash&amp;ref_src=twsrc%5Etfw">#SharePoint</a> <a href="https://twitter.com/hashtag/iPhone?src=hash&amp;ref_src=twsrc%5Etfw">#iPhone</a> <a href="https://twitter.com/hashtag/AppleWatch?src=hash&amp;ref_src=twsrc%5Etfw">#AppleWatch</a> <a href="https://t.co/kWeo9MfpvH">pic.twitter.com/kWeo9MfpvH</a></p>&mdash; takeomagic (@takeomagic) <a href="https://twitter.com/takeomagic/status/1701500349671252166?ref_src=twsrc%5Etfw">September 12, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script

iPhoneの場合は**AppleWatch**にも連携されるので下記のようにきれいに表示される事を確認しました。
左の画面**AppleWatch**の標準メールアプリを開けると複数スケジュールでも1件のメールで送信され、開くと右の画面で複数のスケジュールが表示されています。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/81fed6a1-9246-c920-2b6c-51d979a8def1.png)


前回作成バージョンは<font color="Red">SharePointにスケジュール直接入力していましたが今回はSharePoint上のエクセルで管理できるようにしたため、大幅に利便性アップしました。</font>
[**(前回作成バージョンはこちら)**](https://qiita.com/takeohigashino/items/49d091d7f6abc65e4abf)

今回、下記の点にこだわっています。
| |こだわったポイント           |
|---------|-------------- |
|1|弊社で標準使用している<font color="Red">**SharePoint上Excel**</font>からスケジュール読み込み |
|2|複数スケジュールでも送信されるメールを分けず、<font color="Red">1回で送信される</font>事|
|3|複数スケジュールは<font color="Red">箇条書き</font>で送信される事|
|4|前回作成バージョンになかった<font color="Red">開始時間・会場</font>も案内される事|



## 使用したツール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/27144068-7bf0-9948-9efe-f7bcfd0fd15a.png)
・クラウド版**Power Automate** 
**Power Automate**はMicrosoftより2種類提供されています。
（スマホ版除く）
|バージョン　    |サービス名           |特    記                           |
|---------|-------------- |----------------------------------|
|**Desktop版**|[**Power Automate**](https://www.microsoft.com/ja-jp/biz/smb/column-power-automate-desktop.aspx)|パソコンへインストールするバージョン       |
|**クラウド版**|[**Power Automate**](https://learn.microsoft.com/ja-jp/power-automate/get-started-logic-flow)|各社が運営するWebサービスを利用できる|

:::note info
今回使用したのは[クラウド版**Power Automate**](https://learn.microsoft.com/ja-jp/power-automate/get-started-logic-flow)です。
弊社で標準で使用しているWebサービスSharePointスケジュール表からデータを読み取り、自動送信させるためクラウド版で作成しました。
以下の説明では、標記を**Power Automate**で統一します。
:::

[**SharePoint**](https://www.microsoft.com/ja-jp/microsoft-365/sharepoint/collaboration)
弊社では**SharePoint**を標準で使用しているのでExcel形式のスケジュールを格納先に設定し、会場予約管理に使用している書式をそのまま利用しています。

:::note info
**SharePoint**は、Microsoft提供の同じファイルを複数のユーザーで閲覧できるように共有するシステムサービスです。 **SharePoint**にファイルをアップロードすることによって、ユーザーそれぞれの端末から同じファイルを閲覧することができます。
:::
## ツールの目的
業務・個人スケジュールが混在し、自分からスマホでスケジュール確認をしています。
重要な業務スケジュールを決めたタイミングで個人スマホに自動で知らせてくれる定型業務を「自動化」できれば見落としなどもなくなります。
今回のバージョンでは会議名にプラスして開始時間と会場名も案内項目に含む事としました

## 設定した全体の流れ
① **SharePoint**にスケジュールをExcelで管理します。
　スケジュールの入力を何重にも作業するのであれば意味がないので今回は自グループで統一運用管理している**SharePoint**上の「会場予約管理シート」をそのまま活用しました。
② **Power Automate**に条件を設定します。
  **Power Automate**のフロー作成について、**ChatGPT**に流れを教えてもらいました。
　
　この部分を詳しく説明していきます。
　

:::note warn
**ChatGPT**へのプロンプト
「クラウドPower AutomateへSharePointのエクセルを取り込む方法を教えて下さい。」としました。　下記の**Power Automate**設定です。
:::
ChatGPTからの実際の回答は以下です

:::note warn
SharePointのエクセルファイルをクラウド上のPower Automate（以前の名前はMicrosoft Flow）を使用して取り込む方法は、以下のステップに従って説明します。

・Power Automateのアクセス:
Power Automateにアクセスします。通常、https://flow.microsoft.com/ からアクセスできます。Microsoft 365アカウントを使用してサインインしてください。

・フローの作成:
Power Automateダッシュボードにアクセスしたら、新しいフローを作成します。[フローの作成]ボタンをクリックしてください。

・トリガーの選択:
フローをトリガーする方法を選択します。SharePointのエクセルファイルが変更されたときにフローを実行したい場合、[SharePoint - アイテムが変更されたとき]トリガーを選択できます。また、特定のタイミングで実行するための他のトリガーも利用できます。

・サイトとリストの選択:
トリガーを設定したら、SharePointサイトとリストを選択します。エクセルファイルが格納されている場所を指定してください。

条件の設定（オプション）:
フローが特定の条件を満たす場合にのみ実行されるようにするには、[条件]アクションを追加して条件を設定できます。

・Excelデータの取得:
エクセルファイルのデータを取得するために、[SharePoint - ファイルの取得]アクションを追加します。このアクションを使用して、ファイルの場所とファイル名を指定し、データを取得します。

・データの処理:
取得したエクセルデータを必要な形式に変換したり、他の操作を行うためのアクションを追加します。たとえば、データを変数に格納したり、他のアプリケーションにデータを送信したりできます。

・フローのテスト:
フローをテストし、正しく動作することを確認します。トリガー条件が満たされると、フローが自動的に実行されるはずです。

・フローの保存と有効化:
フローが正常に動作することを確認したら、フローを保存し、有効化します。これにより、エクセルファイルが変更されたときにフローが実行されます。

これで、SharePointのエクセルファイルをPower Automateを使用して取り込む基本的なステップが完了しました。フローを編集してさらに高度な処理を追加することもできます。
:::

## **SharePoint上Excel**事前設定
**SharePoint**で管理しているExcel会議室予約管理シートです。

:::note alert
注意
列1の日付けを検索キーにするので"yyyyMMdd"形式へ変換しておきます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/d793bccc-217a-86b8-6a02-b8f0fd0122bd.png)

:::note info
TEXT([@列3],"yyyyMMddについて
Excelでは日付けはシリアル値形式で保管されているため（1990/1/1が基準日1となる） 検索できるようにA列にyyyyMMddのTEXT形式で変換、コピーしています。
上の画像ではわかりやすくするために赤字にしていますが本来は白字にして字が見えないようにして下さい。
:::

## Power Automate設定
最初に**マイフロー**から**＋新しいフロー**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/42538959-fbe4-7651-d9de-2d611851573a.png)
処理を順番に追加していきます。
今回設定した全体の流れは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/9aadca36-1cf1-d732-cffc-8ab24d23ca51.png)
詳細にみると下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/258439e5-8a0e-b754-eee6-ae3775ced768.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/218ab6d9-19a6-fd22-20c0-13ab4eef065a.png)

横長の箱1つ1つを**ステップ**といいます。
この**ステップ**を押して中に入っていき詳細の設定をしていきます。

**ここから詳細作成のステップです。**
まずフロー名、開始日、繰り返し間隔（今回は毎日なので1日）を入力後**作成**を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/73ce4415-5938-d2e5-5a25-dce37452f01e.png)

１，まず一番上に**Recurrence**（繰り返し処理の意味）の*ステップ*を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/bc03ac20-f4dc-7910-4146-0991e4dca9b6.png)
・タイムゾーンは**日本**を選択。
・設定時間はメールで知らせてもらう8時を選択しました。

２，**変数を初期化する**
名前には何でもよいですが今回は日付けと入力、種類には**文字列**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/78b3d7ef-d87e-6b3c-f0e7-8e12b0f5a024.png)


３，**表内に存在する行を一覧表示**
Excel Online(Business)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/35838abc-2e5c-4747-f379-29635e722324.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/1a57fedf-835f-18cd-2b98-572e8d85e10e.png)
上から
・場所に<font color="Red">Excelが存在するトップページのアドレス</font>を入力。
・ファイルが選択できますので対象ファイルを選択します。
・テーブルが選択できますので目的のテーブル(シート)を選択します。

４，**Apply to each**
   操作を選択から条件を入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/85e9f126-111c-f3a5-012a-ff05975687df.png)
左から検索する列1、次の値に等しい、<font color="Red">addhour(utcNow(),9,'yyyyMMdd')</font>を入力しています。

:::note info
<font color="Red">addhour(utcNow(),9,'yyyyMMdd')</font>'は、標準時間に9時間足して日本時間にするという意味です。
:::


その下
✅はいの場合
値欄にSharePoinのExcelから検索する内容を追加していきます。
今回の例だと、列5(会議名)、列6(開始時間)、列8(会場)ですが、そのままつなげて選択するだけだとメール文書がつながってしまうため、
(例)会議名(スペース)開始時間：10:00(スペース)会議室：12F  となるようスペースや文言を追加します。
又、最後に**＜br＞**を入力する事で、複数のスケジュールでも改行されて表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/fbdce2d6-0c0b-8c94-522a-6ff09153da5f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/4da5b5e0-6910-244c-a330-a53a939e4e3e.png)

**メール通知を送信する**ステップの追加
・宛先 複数アドレスも；で追加できますし、グループ管理のメーリングリストでも対応できます。
・件名 メールのタイトルです
・本文 **動的なコンテンツ**から日付けを選択する事で本日のスケジュールが送信されます。
下記はスマホ(iPhone)で連絡メールを開封した画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/ca21b121-f3fb-2639-e284-718676571397.png)

**小修正発生**
毎日なんらかの会議などあるので問題ないのですが、何も会議予定がない日にも空メールがくる事がわかりました。その修正内容です。
Apply to eachの下に1つプロセスを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/2d15135d-c0ce-8d15-52b6-f26730bb6308.png)

**条件**を開いて図のように選択します。
**日付け**、**次の値に等しい**、値の選択は空白のまま
予定の日付けがない場合　という意味です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/4d01a265-dd2d-372c-8b73-87f4d312e980.png)

その下に**はい**と**いいえ**を分け、**いいえ*に上部で設定したメール送信を通知するをもってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514199/783022ac-47eb-e667-854c-e71749cd0876.png)
これで、予定の日付けがない場合(はい)はなにもせず、予定がある場合(いいえ)はメール送信される事になります。

**最後にフローのソースコード記入します**
{
  "name": "7ca57782-d2a6-45de-b3f8-b6772ac569c9",
  "id": "/providers/Microsoft.Flow/flows/7ca57782-d2a6-45de-b3f8-b6772ac569c9",
  "type": "Microsoft.Flow/flows",
  "properties": {
    "apiId": "/providers/Microsoft.PowerApps/apis/shared_logicflows",
    "displayName": "決めたスケジュール当日朝に案内する",
    "definition": {
      "metadata": {
        "workflowEntityId": null,
        "processAdvisorMetadata": null,
        "flowChargedByPaygo": null,
        "flowclientsuspensionreason": "None",
        "flowclientsuspensiontime": null,
        "flowclientsuspensionreasondetails": null,
        "creator": {
          "id": "a41cb033-7696-4210-acc7-63d910522776",
          "type": "User",
          "tenantId": "76a9015f-a1e0-440f-a5f4-ca0683cd76a1"
        },
        "provisioningMethod": "FromDefinition",
        "failureAlertSubscription": true,
        "clientLastModifiedTime": "2023-09-13T01:42:43.3382395Z"
      },
      "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "$connections": {
          "defaultValue": {},
          "type": "Object"
        },
        "$authentication": {
          "defaultValue": {},
          "type": "SecureObject"
        }
      },
      "triggers": {
        "Recurrence": {
          "recurrence": {
            "frequency": "Day",
            "interval": 1,
            "timeZone": "Tokyo Standard Time",
            "startTime": "2023-09-12T01:00:00.000Z",
            "schedule": {
              "hours": [
                "7"
              ]
            }
          },
          "metadata": {
            "operationMetadataId": "2d8f609c-b291-4ec1-84f1-e9459a7b0336"
          },
          "type": "Recurrence"
        }
      },
      "actions": {
        "表内に存在する行を一覧表示": {
          "runAfter": {
            "変数を初期化する": [
              "Succeeded"
            ]
          },
          "metadata": {
            "016RI6ZZODYQ7K5O24GVGZMARRPVZ6EIZP": "/（2）月度勤務計画/会議室予約.xlsx",
            "operationMetadataId": "1ca90029-22d0-432b-868c-1d89a52f1120",
            "tableId": "{6B286DD6-5772-4B4D-B928-0B4D2A6A3955}"
          },
          "type": "OpenApiConnection",
          "inputs": {
            "host": {
              "apiId": "/providers/Microsoft.PowerApps/apis/shared_excelonlinebusiness",
              "connectionName": "shared_excelonlinebusiness",
              "operationId": "GetItems"
            },
            "parameters": {
              "source": "https://aeon21.sharepoint.com/sites/00000920012",
              "drive": "b!RHLR5fn5BEq0KU8dt-qktWSufzK52pxPmZ217iLzeejWLmNazf_2RpBxCNJDEIFk",
              "file": "016RI6ZZODYQ7K5O24GVGZMARRPVZ6EIZP",
              "table": "{6B286DD6-5772-4B4D-B928-0B4D2A6A3955}"
            },
            "authentication": "@parameters('$authentication')"
          }
        },
        "Apply_to_each": {
          "foreach": "@outputs('表内に存在する行を一覧表示')?['body/value']",
          "actions": {
            "条件": {
              "actions": {
                "文字列変数に追加": {
                  "runAfter": {},
                  "metadata": {
                    "operationMetadataId": "a944d1d9-9f76-4b65-a21c-cfaea3d8e460"
                  },
                  "type": "AppendToStringVariable",
                  "inputs": {
                    "name": "日付け",
                    "value": "@{items('Apply_to_each')?['列5']}　開始：@{items('Apply_to_each')?['列6']}　会場：@{items('Apply_to_each')?['列8']}<br>"
                  }
                }
              },
              "runAfter": {},
              "expression": {
                "equals": [
                  "@items('Apply_to_each')?['列1']",
                  "@addhours(utcNow(),9,'yyyyMMdd')"
                ]
              },
              "metadata": {
                "operationMetadataId": "746736ef-8aa4-4c5e-b0da-6b391680bf34"
              },
              "type": "If"
            }
          },
          "runAfter": {
            "表内に存在する行を一覧表示": [
              "Succeeded"
            ]
          },
          "metadata": {
            "operationMetadataId": "b95a68a6-2662-4d43-bdbb-4bad60b8a175"
          },
          "type": "Foreach"
        },
        "変数を初期化する": {
          "runAfter": {},
          "metadata": {
            "operationMetadataId": "f336e8a2-847d-4878-ab83-bb882c221436"
          },
          "type": "InitializeVariable",
          "inputs": {
            "variables": [
              {
                "name": "日付け",
                "type": "string"
              }
            ]
          }
        },
        "条件_2": {
          "actions": {},
          "runAfter": {
            "Apply_to_each": [
              "Succeeded"
            ]
          },
          "else": {
            "actions": {
              "メール通知を送信する_(V3)": {
                "runAfter": {},
                "metadata": {
                  "operationMetadataId": "776c44de-6431-4bf3-90ca-544e3098175e"
                },
                "type": "OpenApiConnection",
                "inputs": {
                  "host": {
                    "apiId": "/providers/Microsoft.PowerApps/apis/shared_sendmail",
                    "connectionName": "shared_sendmail",
                    "operationId": "SendEmailV3"
                  },
                  "parameters": {
                    "request/to": "takeo@msc.biglobe.ne.jp",
                    "request/subject": "会議案内",
                    "request/text": "<p>本日の計画です<br>\n@{variables('日付け')}</p>"
                  },
                  "authentication": "@parameters('$authentication')"
                }
              }
            }
          },
          "expression": {
            "equals": [
              "@variables('日付け')",
              ""
            ]
          },
          "metadata": {
            "operationMetadataId": "6e7b8494-f987-4410-9208-f55f9e041209"
          },
          "type": "If"
        }
      }
    },
    "connectionReferences": {
      "shared_excelonlinebusiness": {
        "connectionName": "shared-excelonlinebu-82f38051-afad-45b9-a6a5-8ca7b0db31f1",
        "source": "Embedded",
        "id": "/providers/Microsoft.PowerApps/apis/shared_excelonlinebusiness",
        "tier": "NotSpecified"
      },
      "shared_sendmail": {
        "connectionName": "shared-sendmail-188cf175-3b7c-48a9-b70d-d47a0713e4f3",
        "source": "Embedded",
        "id": "/providers/Microsoft.PowerApps/apis/shared_sendmail",
        "tier": "NotSpecified"
      }
    },
    "flowFailureAlertSubscribed": false,
    "isManaged": false
  }
}

最後までご覧いただきありがとうございました。