Power Automate は、アプリやサービスとの間に自動化されたワークフローを作成するためのツールです。
Power AutomateでExcelからデータを取得することがあります。
この記事では、Excelから取得した日付データの表示/出力についてまとめます。

課題:Excelから取得した日付の表示がうまくいかない

coffee 700x700 with name

今日は、Power Automateの「表内に存在する行を一覧表示」を使いました。

Excelのテーブルの全行のデータを取得するアクションですね。

cocoa 700x700 with name
coffee 700x700 with name

「表内に存在する行を一覧表示」で取得した日付データがシリアル値になっていました。 その日付データをEメールの本文に出力させたら、44590といった整数で表示され、日付の形式にはならずに困りました。

Excelの場合は、Text関数でシリアル値をyyyy/mm/ddのような日付形式に変換できますね。

cocoa 700x700 with name
coffee 700x700 with name

はい。Power Automateでは、formatDateTime関数が用意されています。
しかし、formatDateTime関数では、シリアル値を日付形式に変換できません。実行時にエラーが発生します。(エラーメッセージ:関数 'formatDateTime' の日時文字列 '44590' に指定した値が無効です。日時文字列は、ISO 8601 形式に一致する必要があります。)

なるほど。シリアル値を日付形式で表示させたいのですね。どうすればよいかを見ていきましょう。

cocoa 700x700 with name

[シリアル値]
1900年1月1日を「1」とした連番のことです。


[formatDateTime関数]
日時を、指定した形式の文字列に変換するPower Automateの関数です。
書式は次の通りです。
formatDateTime(variables('変数名'), '表示形式')

使用例)formatDateTime(‘2022-01-30', ‘yyyy年MM月dd日') ⇒ 実行結果:2022年1月30日



[ISO 8601形式]
日付と時刻の表記に関するISOの国際規格です。
日付の記述順序を大→小の順序に統一しています。
例)2021-09-27、2021-09-27T15:08:10.78

解決策

Excelから取得した日付データを日付形式で表示させるには次のやり方があります。

日付をISO 8601 形式で取得した場合

  • 「表内に存在する行を一覧表示」の詳細オプションの「DateTime形式」をISO8601に設定します。
  • formatDateTime関数で所望の日付形式に変換できます。

日付をシリアル値で取得した場合

  • 「日時」コネクタの「時間への追加」アクションで、シリアル値をISO8601形式に変換します。この場合、「時間への追加」アクションの各設定は、基準時間を1899/12/31、間隔をシリアル値、時間単位を「日」とします。
  • 次に、formatDateTime関数でISO 8601 形式の日付を所望の日付形式に変換できます。

事例

ここではExcelから取得した日付を表示させる2つの事例を紹介します。
Excelで作成したタスク管理表をPower Automateで取得し、一日一回、直近の期限のタスクをEメールで通知するフローです。
なお、事例においてEメールはOutlook.comを、ファイルの格納場所はOneDriveを使用しています。

準備

Excelで次に示すタスク管理表を作成します。
0010-table

ここでは、ファイル名をtaskList.xlsx、テーブル名をtaskListとしました。
なお、ファイルはOneDriveのフォルダ/Documents/job1に置きました。

日付をISO 8601 形式で取得した場合

以下はフローの全体です。上から順に実行されます。
0000-overview

「Recurrence」では、1日1回トリガーが発生します。
「表内に存在する行を一覧表示」では、Excelファイルに記載されたタスク管理表taskListの内容をすべて取得します。この時点で日時データをISO8601形式で取得します。
「変数を初期化する deadline」では、変数deadlineに初期値を設定します。
「Apply to each 直近の期限を抽出」では、taskListから最も直近の期限を抽出します。
「Apply to each メール送信」では、直近の期限を通知するEメールを送信します。

Recurrence

「作成」をクリックし、「スケジュール済みクラウドフロー」を選択します。
0010-create flow

フロー名を入力し、繰り返し間隔を1日に設定します。その後「作成」をクリックします。0020-flow name and interval

Recurrenceが作成されます。
0030-Recurrence

表内に存在する行を一覧表示

コネクタ「Excel Online(OneDrive)」のアクション「表内に存在する行を一覧表示」を追加します。
0040-excel online (oneDrive)


タスク管理表のファイル/Documents/job1/taskList.xlsxおよびテーブルtaskListを選択します。
0042-表内に存在する行を一覧表示


次に、詳細オプションを表示する、をクリックします。

一番下の「DateTime形式」の欄で、「ISO 8601」を選択します。
0043-表内に存在する行を一覧表示
この設定によってExcelのテーブルに含まれる日時データがISO 8601形式で取得されます。

変数を初期化する deadline

コネクタ「変数」のアクション「変数を初期化する」を追加します。

名前、値、種類を入力します。
ここでは、名前をdeadline、値をISO 8601形式で9999-12-31T00:00:00.0000000Zとしました。
種類には文字列を設定します。
これにより、変数deadlineに、文字列9999-12-31T00:00:00.0000000Zが設定されます。
0050-変数を初期化する

Apply to each 直近の期限を抽出

コネクタ「コントロール」のアクション「Apply to each」ループを追加します。

Apply to eachの「以前の手順から出力を選択」の欄には、「表内に存在する行を一覧表示」のvalueを設定します。
これにより、タスク管理表の値が上から1行ずつループの度に取得されます。
0061-Apply to each


Apply to each内にアクション「条件」を追加します。

条件の左の欄には「表内に存在する行を一覧表示」の「期限」を設定します。
この場合、「期限」はISO 8601形式でExcelから取得されます。
条件の右の欄には変数のdeadlineを設定します。
真ん中は「次の値未満」とします。
これにより、タスク管理表の期限の列の値を1つずつ変数deadlineと比較し、より直近の期限の値がきた場合は、条件に合致することになります。
0070-条件

「条件」の「はいの場合」にアクション「変数の設定」を追加します。

名前の欄はdeadline、値の欄は「表内に存在する行を一覧表示」の「期限」を設定します。
以上により、変数deadlineに最も直近の期限が格納されます。
0071-条件

Apply to each メール送信

アクション「Apply to each」を追加します。

Apply to eachの「以前の手順から出力を選択」の欄には、「表内に存在する行を一覧表示」のvalueを設定します。
これにより、タスク管理表の値が上から1行ずつループの度に取得されます。
0080-Apply to each


追加したApply to each内にアクション「条件」を追加します。

条件の左の欄には「表内に存在する行を一覧表示」の「期限」を設定します。
条件の右の欄には変数のdeadlineを設定します。
真ん中は「次の値に等しい」とします。0090-条件

「条件」の「はいの場合」の中に、コネクタ「Outlook.com」のアクション「メールの送信(V2)」を追加します。

Eメールの件名欄に、以下の関数を記載しています。
formatDateTime(variables('deadline'),'yyyy年MM月dd日')
これにより、変数deadlineに格納されたISO 8601形式の日付が'yyyy年MM月dd日'の形式に変換されます。

また、Eメールの件名欄に、「表内に存在する行を一覧表示」の「タスク」を記載しています。
これにより、タスク管理表に記載されたタスクの名称も表示されます。
0100-メールの送信


以上で、フローが完成しました。

実行

フローを実行すると、直近のタスクが1日に1回Eメールで通知されます。

以下は、そのEメールの内容です。期限とタスク名とが件名に表示されます。
期限は、formatDateTime関数で指定した通り、yyyy年MM月dd日の形式となっています。
0110-メールの送信
0210-email




日付をシリアル値で取得した場合

以下はフローの全体です。
0000-overview

「Recurrence」では、1日1回トリガーが発生します。
「表内に存在する行を一覧表示」では、Excelファイルに記載されたタスク管理表taskListの内容をすべて取得します。
「変数を初期化する deadline」では、変数deadlineを初期値を設定します。
「Apply to each 直近の期限を抽出」では、taskListから最も直近の期限を抽出します。
「時間への追加 (ISO8601形式へ変換)」では、シリアル値をISO8601形式へ変換します。
「Apply to each メール送信」では、直近の期限を通知するEメールを送信します。

Recurrence

「作成」をクリックし、「スケジュール済みクラウドフロー」を選択します。
0010-create flow

フロー名を入力し、繰り返し間隔を1日に設定します。その後「作成」をクリックします。0020-flow name and interval

Recurrenceが作成されます。
0030-Recurrence

表内に存在する行を一覧表示

コネクタ「Excel Online(OneDrive)」のアクション「表内に存在する行を一覧表示」を追加します。
0040-excel online (oneDrive)

タスク管理表のファイル/Documents/job1/taskList.xlsxおよびテーブルtaskListを選択します。
0042-表内に存在する行を一覧表示

次に、詳細オプションを表示する、をクリックします。

一番下の「DateTime形式」の欄は何も選択しないか、または「Serial Number」を選択します。
0003-表内に存在する行を一覧表示

この設定によってExcelのテーブルに含まれる日時データをシリアル値で取得できます。

変数を初期化する deadline

コネクタ「変数」のアクション「変数を初期化する」を追加します。

ここでは、名前をdeadline、値をシリアル値で999999としました。
種類には文字列を設定します。
0004-変数を初期化する

Apply to each 直近の期限を抽出

コネクタ「コントロール」のアクション「Apply to each」を追加します。

Apply to eachの「以前の手順から出力を選択」の欄には、「表内に存在する行を一覧表示」のvalueを設定します。
0061-Apply to each


Apply to each内にアクション「条件」を追加します。

条件の左の欄には「表内に存在する行を一覧表示」の「期限」を設定します。
この場合、「期限」はシリアル値でExcelから取得されます。
条件の右の欄には変数のdeadlineを設定します。
真ん中は「次の値未満」とします。0070-条件

「条件」の「はいの場合」にアクション「変数の設定」を追加します。

名前の欄はdeadline、値の欄は「表内に存在する行を一覧表示」の「期限」を設定します。
0071-条件


時間への追加 (ISO8601形式へ変換)★

コネクタ「日時」のアクション「時間への追加」を追加します。

基準時間の欄は1899/12/31を入力します。
間隔の欄は変数deadlineを入力します。
時間単位の欄は「日」を選択します。
以上で、変数deadlineに格納されたシリアル値がISO8601形式に変換されます。
タイトルなし

Apply to each メール送信

アクション「Apply to each」を追加します。

Apply to eachの「以前の手順から出力を選択」の欄には、「表内に存在する行を一覧表示」のvalueを設定します。
0080-Apply to each

追加したApply to each内にアクション「条件」を追加します。

条件の左の欄には「表内に存在する行を一覧表示」の「期限」を設定します。
条件の右の欄には変数のdeadlineを設定します。
真ん中は「次の値に等しい」とします。0090-条件

「条件」の「はいの場合」に、コネクタ「Outlook.com」のアクション「メールの送信(V2)」を追加します。

Eメールの件名欄に、以下の関数を記載します。
formatDateTime(body('時間への追加_(ISO8601形式へ変換)'), 'yyyy/MM/dd')
これにより、アクション「時間への追加 (ISO8601形式へ変換)」の出力(ISO 8601形式)の日付が'yyyy/MM/dd'の形式に変換されます。

また、Eメールの件名欄に、「表内に存在する行を一覧表示」の「タスク」を記載しています。
これにより、タスク管理表に記載されたタスクの名称も表示されます。
0100-メールの送信


以上で、フローが完成しました。

実行

フローを実行すると、直近のタスクが1日に1回、Eメールで通知されます。

以下は、そのEメールの内容です。期限とタスク名とが件名に表示されます。
期限は、formatDateTime関数で指定した通り、yyyy/MM/ddの形式となっています。
0011-email
0012-email


まとめ

  • 日付がISO8601形式の場合、formatDateTime関数を使って所望の日付形式に変換できます。
  • 日付がシリアル値の場合、「日時」コネクタの「時間への追加」アクション、およびformatDateTime関数を使って所望の日付形式に変換できます。

参考