Power Automate

Excel セルデータを Office Script でフローに渡す

  • 2024.10.28

今回は、Excel の任意のセルに入っているデータを Power Automate のフローに引き渡す方法についてご紹介します。

テーブルにしていれば、フローから直接データを取得しにいけますが、テーブルではない場合は今回紹介する Office Script を利用すると便利です。

完成イメージの確認

今回作成する フローの完成イメージです。今回は、SharePoint サイトのライブラリに入館証明書 貸与申請 (Excel ファイル) が保存されると、ファイルからデータを抜き出しリストに転記します。

事前準備

1.Excel ファイルの準備

申請フォーマットなど抜き出したいデータが含まれている Excel ファイルを用意します。

2.SharePoint サイトにライブラリとリストを用意

任意の名前でライブラリを用意します。特別な設定入りません。

Excel ファイル (入館証明書 貸与申請) の内容が登録されていくリストを用意します。今回は以下の通りに用意しました。

実装

Office Script と フローの実装を行います。

1.Office Script の実装

Excel の [自動化] タブより [新しいスクリプト] をクリックし以下の通り記述し、任意の名前を付けて保存します。


function main(workbook: ExcelScript.Workbook) {
    let selectedSheet = workbook.getActiveWorksheet();
    // DateTimeFormatOptionsを指定して日付を文字列に変換
    let options: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };
    const obj = {
        "申請日": new Date((selectedSheet.getCell(3, 5).getValue() as number - 25569) * 86400 * 1000 ).toLocaleDateString('ja-jp', options),//行列番号による指定(日付⇒文字列 yyyy/MM/dd)
        "申請者所属": selectedSheet.getRange('B6').getValue(),//アドレスによる指定
        "申請者名": selectedSheet.getRange('申請者名').getValue(),//範囲名による指定
        "利用者会社名": selectedSheet.getCell(8, 1).getValue(),//行列番号による指定 文字列
        "利用者会氏名": selectedSheet.getCell(9, 1).getValue(),
        "利用期間自": formatDateToYYYYMMDD(new Date((selectedSheet.getCell(11, 2).getValue() as number - 25569) * 86400 * 1000)),//シリアル値から文字列に変換
        "利用期間至": selectedSheet.getCell(11, 5).getValue(),//Excel 版シリアル値のまま
        "入館理由": selectedSheet.getRange('入館理由').getValue()
    }
   console.log(obj);
    return obj;
}
const formatDateToYYYYMMDD = (date:Date) => {
    const year = date.getFullYear();
    const month = (date.getMonth() + 1).toString().padStart(2, '0');
    const day = date.getDate().toString().padStart(2, '0');
    return `${year}-${month}-${day}`;
}

※ 行列番号を指定する場合、1 行目が 0 で A 列が 0 となります。

2.フローの実装

以下の通りフローを作成します。

Office Script で 属性名を指定してオブジェクトを作成したので、動的なコンテンツから簡単に指定が可能です。

申請日:
Office Script 内で yyyy/MM/dd となるよう文字列にしているため、そのまま日付列にセット可能

利用期間(自):
Office Script 内で yyyy-MM-dd となるよう文字列にしているため、そのまま日付列にセット可能

利用期間(至):
Office Script 内で Excel のシリアル値のまま フローに返しました。
Excel のシリアル値は、1900/01/01 からはじまり、1 日で 1 であるため、式で変換します。但し、Excel は 1900 年をうるう年として認識しており、1900/02/29 という存在しない日にちをカウントしてしまいます。その為、関数は以下の様に設定します。

addDays('1899-12-30', int(outputs('スクリプトの実行')?['body/result/利用期間至']), 'yyyy-MM-dd')

動作確認

各入力項目に値を入れた状態でライブラリにアップロードします。”ファイルが作成されたとき” トリガーを利用しているため、自動でフローが動作しリストにデータが転記されます。

まとめ

テーブルにはなっていない Excel ファイルからデータを抽出しなければならないケースはまだまだ多々あると思うので、参考になれば幸いです♪

また、今回のサンプルには出てきませんが、日付を利用する時は以下に気を付けて利用しましょう。

  • スクリプト内で new Date() などを用いて日付を生成した場合
    シリアル値: 1 ミリセカンド= 1
  • Excel セル内のデータの場合
    シリアル値: 1 日= 1

日付は シリアル値の違いもあるので、Office Script 内で文字列に変換するのかフロー側で変換するのか検討が必要になりそうですね。

関連コース

お問い合わせ

イルミネート・ジャパンが提供するトレーニングやサービスに関するご相談など、
お気軽にご連絡ください。

担当者に相談する