Power Automate は、アプリやサービスとの間に自動化されたワークフローを作成するためのツールです。
Power AutomateでExcelからデータを取得することがあります。
この記事では、Excelから取得した日付データの表示/出力についてまとめます。
課題:Excelから取得した日付の表示がうまくいかない
![]() |
今日は、Power Automateの「表内に存在する行を一覧表示」を使いました。 |
Excelのテーブルの全行のデータを取得するアクションですね。 |
![]() |
![]() |
「表内に存在する行を一覧表示」で取得した日付データがシリアル値になっていました。 その日付データをEメールの本文に出力させたら、44590といった整数で表示され、日付の形式にはならずに困りました。 |
Excelの場合は、Text関数でシリアル値をyyyy/mm/ddのような日付形式に変換できますね。 |
![]() |
![]() |
はい。Power Automateでは、formatDateTime関数が用意されています。 |
なるほど。シリアル値を日付形式で表示させたいのですね。どうすればよいかを見ていきましょう。 |
![]() |
[シリアル値]
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で次に示すタスク管理表を作成します。
ここでは、ファイル名をtaskList.xlsx、テーブル名をtaskListとしました。
なお、ファイルはOneDriveのフォルダ/Documents/job1に置きました。
日付をISO 8601 形式で取得した場合
「Recurrence」では、1日1回トリガーが発生します。
「表内に存在する行を一覧表示」では、Excelファイルに記載されたタスク管理表taskListの内容をすべて取得します。この時点で日時データをISO8601形式で取得します。
「変数を初期化する deadline」では、変数deadlineに初期値を設定します。
「Apply to each 直近の期限を抽出」では、taskListから最も直近の期限を抽出します。
「Apply to each メール送信」では、直近の期限を通知するEメールを送信します。
Recurrence
「作成」をクリックし、「スケジュール済みクラウドフロー」を選択します。
フロー名を入力し、繰り返し間隔を1日に設定します。その後「作成」をクリックします。
表内に存在する行を一覧表示
コネクタ「Excel Online(OneDrive)」のアクション「表内に存在する行を一覧表示」を追加します。
タスク管理表のファイル/Documents/job1/taskList.xlsxおよびテーブルtaskListを選択します。
次に、詳細オプションを表示する、をクリックします。
一番下の「DateTime形式」の欄で、「ISO 8601」を選択します。
この設定によってExcelのテーブルに含まれる日時データがISO 8601形式で取得されます。
変数を初期化する deadline
コネクタ「変数」のアクション「変数を初期化する」を追加します。
名前、値、種類を入力します。
ここでは、名前をdeadline、値をISO 8601形式で9999-12-31T00:00:00.0000000Zとしました。
種類には文字列を設定します。
これにより、変数deadlineに、文字列9999-12-31T00:00:00.0000000Zが設定されます。
Apply to each 直近の期限を抽出
コネクタ「コントロール」のアクション「Apply to each」ループを追加します。
Apply to eachの「以前の手順から出力を選択」の欄には、「表内に存在する行を一覧表示」のvalueを設定します。
これにより、タスク管理表の値が上から1行ずつループの度に取得されます。
Apply to each内にアクション「条件」を追加します。
条件の左の欄には「表内に存在する行を一覧表示」の「期限」を設定します。
この場合、「期限」はISO 8601形式でExcelから取得されます。
条件の右の欄には変数のdeadlineを設定します。
真ん中は「次の値未満」とします。
これにより、タスク管理表の期限の列の値を1つずつ変数deadlineと比較し、より直近の期限の値がきた場合は、条件に合致することになります。
「条件」の「はいの場合」にアクション「変数の設定」を追加します。
名前の欄はdeadline、値の欄は「表内に存在する行を一覧表示」の「期限」を設定します。
以上により、変数deadlineに最も直近の期限が格納されます。
Apply to each メール送信
アクション「Apply to each」を追加します。
Apply to eachの「以前の手順から出力を選択」の欄には、「表内に存在する行を一覧表示」のvalueを設定します。
これにより、タスク管理表の値が上から1行ずつループの度に取得されます。
追加したApply to each内にアクション「条件」を追加します。
条件の左の欄には「表内に存在する行を一覧表示」の「期限」を設定します。
条件の右の欄には変数のdeadlineを設定します。
真ん中は「次の値に等しい」とします。
「条件」の「はいの場合」の中に、コネクタ「Outlook.com」のアクション「メールの送信(V2)」を追加します。
Eメールの件名欄に、以下の関数を記載しています。
formatDateTime(variables('deadline'),'yyyy年MM月dd日')
これにより、変数deadlineに格納されたISO 8601形式の日付が'yyyy年MM月dd日'の形式に変換されます。
また、Eメールの件名欄に、「表内に存在する行を一覧表示」の「タスク」を記載しています。
これにより、タスク管理表に記載されたタスクの名称も表示されます。
以上で、フローが完成しました。
実行
フローを実行すると、直近のタスクが1日に1回Eメールで通知されます。
以下は、そのEメールの内容です。期限とタスク名とが件名に表示されます。
期限は、formatDateTime関数で指定した通り、yyyy年MM月dd日の形式となっています。
日付をシリアル値で取得した場合
「Recurrence」では、1日1回トリガーが発生します。
「表内に存在する行を一覧表示」では、Excelファイルに記載されたタスク管理表taskListの内容をすべて取得します。
「変数を初期化する deadline」では、変数deadlineを初期値を設定します。
「Apply to each 直近の期限を抽出」では、taskListから最も直近の期限を抽出します。
「時間への追加 (ISO8601形式へ変換)」では、シリアル値をISO8601形式へ変換します。
「Apply to each メール送信」では、直近の期限を通知するEメールを送信します。
Recurrence
「作成」をクリックし、「スケジュール済みクラウドフロー」を選択します。
フロー名を入力し、繰り返し間隔を1日に設定します。その後「作成」をクリックします。
表内に存在する行を一覧表示
コネクタ「Excel Online(OneDrive)」のアクション「表内に存在する行を一覧表示」を追加します。
タスク管理表のファイル/Documents/job1/taskList.xlsxおよびテーブルtaskListを選択します。
次に、詳細オプションを表示する、をクリックします。
一番下の「DateTime形式」の欄は何も選択しないか、または「Serial Number」を選択します。
この設定によってExcelのテーブルに含まれる日時データをシリアル値で取得できます。
変数を初期化する deadline
コネクタ「変数」のアクション「変数を初期化する」を追加します。
ここでは、名前をdeadline、値をシリアル値で999999としました。
種類には文字列を設定します。
Apply to each 直近の期限を抽出
コネクタ「コントロール」のアクション「Apply to each」を追加します。
Apply to eachの「以前の手順から出力を選択」の欄には、「表内に存在する行を一覧表示」のvalueを設定します。
Apply to each内にアクション「条件」を追加します。
条件の左の欄には「表内に存在する行を一覧表示」の「期限」を設定します。
この場合、「期限」はシリアル値でExcelから取得されます。
条件の右の欄には変数のdeadlineを設定します。
真ん中は「次の値未満」とします。
「条件」の「はいの場合」にアクション「変数の設定」を追加します。
名前の欄はdeadline、値の欄は「表内に存在する行を一覧表示」の「期限」を設定します。
時間への追加 (ISO8601形式へ変換)★
コネクタ「日時」のアクション「時間への追加」を追加します。
基準時間の欄は1899/12/31を入力します。
間隔の欄は変数deadlineを入力します。
時間単位の欄は「日」を選択します。
以上で、変数deadlineに格納されたシリアル値がISO8601形式に変換されます。
Apply to each メール送信
アクション「Apply to each」を追加します。
Apply to eachの「以前の手順から出力を選択」の欄には、「表内に存在する行を一覧表示」のvalueを設定します。
追加したApply to each内にアクション「条件」を追加します。
条件の左の欄には「表内に存在する行を一覧表示」の「期限」を設定します。
条件の右の欄には変数のdeadlineを設定します。
真ん中は「次の値に等しい」とします。
「条件」の「はいの場合」に、コネクタ「Outlook.com」のアクション「メールの送信(V2)」を追加します。
Eメールの件名欄に、以下の関数を記載します。
formatDateTime(body('時間への追加_(ISO8601形式へ変換)'), 'yyyy/MM/dd')
これにより、アクション「時間への追加 (ISO8601形式へ変換)」の出力(ISO 8601形式)の日付が'yyyy/MM/dd'の形式に変換されます。
また、Eメールの件名欄に、「表内に存在する行を一覧表示」の「タスク」を記載しています。
これにより、タスク管理表に記載されたタスクの名称も表示されます。
以上で、フローが完成しました。
実行
フローを実行すると、直近のタスクが1日に1回、Eメールで通知されます。
以下は、そのEメールの内容です。期限とタスク名とが件名に表示されます。
期限は、formatDateTime関数で指定した通り、yyyy/MM/ddの形式となっています。
まとめ
- 日付がISO8601形式の場合、formatDateTime関数を使って所望の日付形式に変換できます。
- 日付がシリアル値の場合、「日時」コネクタの「時間への追加」アクション、およびformatDateTime関数を使って所望の日付形式に変換できます。
コメント