はじめに
この記事は、Microsoft Power Automate Advent Calendar 2025 12月22日(月) 担当分の記事です。
当記事はOfficeScriptでCSVデータをもとにExcelファイルを作成する記事になります。
「ファイルの作成」アクションは、CSVテーブル→CSVファイルの作成はできますが、CSVテーブル→Excelファイルの作成はできなかったと思います。
Apply To Each内でExcelコネクタの「表に行を追加」アクションを使って1行ずつデータを追加していくのは時間がかかります。
今回はデータ量・処理時間の制限があるもののOfficeScriptを活用して、Excelファイルを作成する方法をご紹介します。
フロー概要
「ファイルの取得(プロパティのみ)」アクションからSharePointライブラリに格納されているファイル情報(更新者・更新日時・登録者・登録日時、URLなど)をExcelデータに出力するフローをご説明します。
フロー詳細
繰り返し
毎週月~金曜日の0:00、12:00に起動されるように設定しています。

ファイルの取得(プロパティのみ)
上から順に取得は5000にしています。
また、改ページはオンにして、しきい値を5000にしています。

選択
マップは主に「ファイルの取得(プロパティのみ)」アクションのパラメータを設定しています。

※種類はフォルダーorファイルをifで判定
URLはアイテムへのリンクをdecodeUriComponent関数でデコード。
CSVテーブルの作成
SharePoint ライブラリからスクリプトを実行する
スクリプトに指定した「CSV→Excel変換.osts」は以下Microsoft Learnのサンプルコードを活用しています。
「CSVテーブルの作成」アクションを設けず、「選択」アクションの出力をもとにExcelファイルを作成したほうが、シンプルのように思いますが、別の機会にJSON(選択アクションの出力)→Excelの例を記事化します。
出力ファイル
以下のようなデータができます。CSVとあまり変わりません(笑)。

ただ、CSVに比べて人が扱いやすいところは利点のように思います。
以下の画像の赤枠はHyperlink関数をテーブルに仕込んでます。
フロー実行後リンク付きでExcelファイル作成ができます。

制限
OfficeScriptは大量データの場合は制限に引っ掛かってしまうことがあります。
ExcelとPower Automateの部分が重要と思うのでまとめます。
Excel
- 要求と応答は 5 MB に制限されています
- 範囲は500 万セルに制限されます
上記は以下のとおりと理解できます。
- Power AutomateからOfficeScriptへの引数と戻り値のデータサイズは5MBまで※1
- OfficeScriptの読み書き(読み:getValue()、書き:setValue())できるセルの総数が500万セルまで
Power Automate
- 各ユーザーは、1 日あたり 1,600 回 のスクリプト実行アクションの呼び出しに制限されています
- 同期 Power Automate 操作には 120 秒のタイムアウトがあります
- スクリプトの実行アクションに渡されるパラメーターの最大サイズは 30,000,000 バイト (28.6 MB) です
上記は以下のとおりと理解できます。
- スクリプト実行アクションが使えるのは1日1600回まで
- Office Scriptsの実行時間が120秒を超えるとタイムアウト
- Power AutomateからOffice ScritpsへのCSVデータの引数として渡せるのは28.6MBまで※1
※1…引数はPower Automate側では28.6MBまでデータを渡せますが、Excel Online側では5MBまでしか受け取れないので、5MBに抑えられると思っています。
※2…処理速度は120秒以内に収める必要があるためOffice Script内で処理効率の改善も必要です。
実際試した例
実際に大量のデータの場合は処理がタイムアウトしました。
Copilotに確認して、以下の部分が行単位でCSVデータをExcelに書き込んでいますので、全行一括でExcelに書き込みするように修正するとタイムアウトになりませんでした。
rows.forEach((value, index) => {
//中略//
// Create a 2D array with one row.
let data: string[][] = [];
data.push(row);
// Put the data in the worksheet.
let range = sheet.getRangeByIndexes(index, 0, 1, data[0].length);
//forEachの中でセルに書込みをしている
range.setValues(data);
}
});
ただ、大量すぎるデータの場合は、制限に引っ掛かってしまいますので
「ファイルの取得(プロパティのみ)」アクションのパラメータ(フィルダークエリ、上から順に取得、エントリーをフォルダに制限する)でデータサイズを抑えるのが良いと思います。
OfficeScriptについて
OfficeScriptは「TypeScript」というプログラミング言語を使っています。
TypeScriptは今年の後半に仕事で扱いましたので、勉強し始めました。
具体的には以下の内容をAIに頼りながら独学で学習しています。
- 値
- プリミティブ
- 数値、BigInt、文字列、真偽値、シンボル、null、undefined
- オブジェクト
- 配列、関数、クラス
- プリミティブ
- 文法
- 一般
- if-else、while、for、try-catch
- 変数・関数
- var、let、const ※varは最近あまり使わないらしい
- 文字列
- 文字列の結合(リテラル付き)
- null、undefined
- null合体演算子、オプショナルチェイニング
- 配列、オブジェクト
- forEach()、Map()、for-of、スプレット構文
※forEachは配列の数分処理
Mapは配列をもとに新たに別の配列を作成
- forEach()、Map()、for-of、スプレット構文
- 関数
- 関数宣言、関数式、アロー関数
- 一般
まとめ(所感)
CSVではそのままでは利用者が扱いづらいし、Excelにするには一手間必要です。
SharePointリストでデータ作成するには、Apply To Each内で「項目の作成」アクションを使用するため、処理時間が掛かります。
また、そこまで定型データをきっちり管理する必要が無いかもしれません。
Power Queryで扱うほどのデータ量でもなく、利用者が事務処理でほしい程度のデータを定期的に作成・加工する手段としてOfficeScriptは有効と感じました。
今度は「選択」アクションのJSONデータをExcel出力する記事も書いてみたいと思います。
最後まで読んでいただきありがとうございました。



