はじめに
本記事はOffice Script(JSON→Excel変換)コードを学習する記事です。
以下記事ではMicrosoft Learnのサンプルコードを使用してCSVテーブルをExcelに変換するフローを紹介しました。
上記記事では、CSVテーブルの作成アクションを使用しています。

本記事では、以下フローのように選択アクションの出力結果のJSONをそのままExcelに出力するOffice Scriptの紹介となります。

Office Script
作成は一旦Copilotに書いてもらいました。
function main(workbook: ExcelScript.Workbook, jsonDataAsString: string) {
// 1. 【入力】Power Automateから渡されたJSON文字列を解析
// - jsonDataAsString: Power Automateの「選択」アクションの結果(JSON配列)を文字列化したもの
const dataArray: Record<string, string | number | boolean>[] = JSON.parse(jsonDataAsString);
// データが空の場合は処理を終了
if (dataArray.length === 0) {
console.log("処理対象のデータがありませんでした。");
return;
}
// 2. 【ヘッダー処理】ヘッダー行を配列の先頭に追加 (一度だけ実行)
// --------------------------------------------------------------------------
const headers = Object.keys(dataArray[0]);
// 3. 【データ変換】JSON配列を二次元配列に変換
// --------------------------------------------------------------------------
const values: (string | number | boolean)[][] = dataArray.map(obj => {
// headersの順序に従って値を取り出し、行データ(配列)を作成
return headers.map(header => {
// 値がnullやundefinedの場合は空文字列に変換して書き込みエラーを回避
const value = obj[header];
return (value === null || value === undefined) ? "" : value;
});
});
// 4. 【最終的な書き込みデータ作成】ヘッダー行をデータ本体の先頭に追加
const dataToWrite = [headers, ...values];
// 5. 【書き込み】ターゲットシートと範囲を設定し、一括書き込み
// --------------------------------------------------------------------------
const sheet = workbook.getWorksheet("Sheet1"); // ★シート名に合わせて変更してください
// 書き込み範囲を設定 (ヘッダー行 + データ行数, 列数)
const rowCount = dataToWrite.length;
const colCount = headers.length;
// A1から始まる書き込み範囲を取得
const range = sheet.getRangeByIndexes(0, 0, rowCount, colCount);
// ★ここでデータ全体を一括でシートに書き込む(SetValues)
range.setValues(dataToWrite);
console.log(`データをシートに書き込みました。行数: ${rowCount}, 列数: ${colCount}`);
}
コードの詳細
コードのコメントNoと以下章のNoが関連していますのでご確認ください。
1.JSON解析
Power Automateの選択アクションの出力結果(JSON)をキーと値のレコード型のオブジェクト配列に変換しています。
const dataArray: Record<string, string | number | boolean>[] = JSON.parse(jsonDataAsString);
Record型はキーと値のペアでそれぞれ型を指定できるオブジェクト配列です。
| 種類 | 型 |
|---|---|
| キー | string(文字列) |
| 値 | string(文字列)、number(数値)、boolean(真偽値)のいずれか |
詳細はTypeScript公式ページを参照ください。
具体的には以下の jsonDataAsString → dataArrayのように変換されます。
- jsonDataAsString(選択アクションの出力)
[
{
"ProductName": "Laptop",
"Price": 120000,
"IsActive": true,
"Category": "Electronics"
},
{
"ProductName": "Smartphone",
"Price": 80000,
"IsActive": false,
"Category": "Electronics"
},
{
"ProductName": "Desk Chair",
"Price": 15000,
"IsActive": true,
"Category": "Furniture"
}
]
※分かりやすいように、ファイル情報ではなく商品情報でJSONの例を挙げています。
- dataArray(Json.Parse後)
[
{ ProductName: "Laptop", Price: 120000, IsActive: true, Category: "Electronics" },
{ ProductName: "Smartphone", Price: 80000, IsActive: false, Category: "Electronics" },
{ ProductName: "Desk Chair", Price: 15000, IsActive: true, Category: "Furniture" }
]
2.ヘッダー処理
先頭の要素のキー名をすべて取得します。
const headers = Object.keys(dataArray[0]);
具体的には以下の dataArray → dataArray[0] → headersのように変換されます。
- dataArray(Json.Parse後)
[
{ ProductName: "Laptop", Price: 120000, IsActive: true, Category: "Electronics" },
{ ProductName: "Smartphone", Price: 80000, IsActive: false, Category: "Electronics" },
{ ProductName: "Desk Chair", Price: 15000, IsActive: true, Category: "Furniture" }
]
- dataArray[0]…配列の先頭要素
{ ProductName: "Laptop", Price: 120000, IsActive: true, Category: "Electronics" }
- headers...Object.keys...キー名取得
["ProductName", "Price", "IsActive", "Category"]
Object.keysはキー名を文字列配列として取得します。
ちなみに、Object.valuesは値を文字列配列として取得します。
- Object.values...値を取得(参考)
["Laptop", 120000, true, "Electronics"]
3.JSON配列を2次元配列に変換
dataArray(オブジェクト配列)をExcel出力用の2次元配列に変換しています。
const values: (string | number | boolean)[][] = dataArray.map(obj => {
return headers.map(header => {
const value = obj[header];
return (value === null || value === undefined) ? "" : value;
});
});
以下のような配列変数および処理を行って、2次元配列であるValuesに格納しています。
| 配列変数 | 配列の内容 | 処理 |
|---|---|---|
| dataArray | Record型(キーと値について型を指定できるオブジェクト)の配列 | dataArray.mapで一つずつオブジェクト※{ProductName:~...Category:~}単位で取得 |
| headers | キー名の配列 | obj[header](ブラケット記法)でキーから値を取得してValueに格納 |
ブラケット記法はcourse_kさんの記事を参考にさせていただきました🙇♂️
具体的には、dataArrayとHeadersを使って、二次元配列であるValuesにデータを格納しています。
Valuesは以下のようになります。
- dataArray(Json.Parse後)
[
{ ProductName: "Laptop", Price: 120000, IsActive: true, Category: "Electronics" },
{ ProductName: "Smartphone", Price: 80000, IsActive: false, Category: "Electronics" },
{ ProductName: "Desk Chair", Price: 15000, IsActive: true, Category: "Furniture" }
]
- headers
["ProductName", "Price", "IsActive", "Category"]
- Values
[
["Laptop", 120000, true, "Electronics"],
["Smartphone", 80000, false, "Electronics"],
["Desk Chair", 15000, true, "Furniture"]
]
headerがキーのため、obj[header]でキーから値を取り出すイメージです。
return文はValueがnullまたはundefinedであれば空文字を返して、そうでなければValueを返すようにしています。
三項演算子:条件式 ? 真の場合の値 : 偽の場合の値; を使用
4.書込みデータ作成
ヘッダー(headers)とデータ(values)を追加して書込むデータを作成しています。
const dataToWrite = [headers, ...values];
...valuesはスプレット構文でvaluesのすべての要素になります。
dataToWriteは以下のようになります。
- dataToWrite
[
["ProductName", "Price", "IsActive", "Category"],
["Laptop", 120000, true, "Electronics"],
["Smartphone", 80000, false, "Electronics"],
["Desk Chair", 15000, true, "Furniture"]
]
5.書込み
dataToWriteの内容をExcelに出力します。
const sheet = workbook.getWorksheet("Sheet1");
const rowCount = dataToWrite.length;
const colCount = headers.length;
const range = sheet.getRangeByIndexes(0, 0, rowCount, colCount);
range.setValues(dataToWrite);
getRangeByIndexesはIndex(第1引数)には書込む開始行、0(第2引数)は開始列、1(第3引数)は行数、data[0].lengthは列数になります。
setValuesは引数に2次元配列が必要になります。
学習した所感
先日、以下の記事でCSV→Excelに変換するOffice Scriptコードを理解する記事を投稿しましたが、JSON→Excelに変換するOffice Scriptコードのほうがシンプルでした。
今回のコードは、オブジェクトの配列(JSON文字列)から二次元配列を作成していますが、オブジェクト配列からExcel出力用の配列を作成するにはmapが有効と感じました。
フローでは「ファイルの取得(プロパティのみ)」アクションとしていますが、「複数の項目の取得」アクションでも活用できそうです。
また、Power AppsのJSON関数で作成したJSONを渡してもよいかもしれません。
個人的に活用法を見出したいです。