1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Office Script(JSON→Excel変換)をCopilotに作成してもらい自分も理解する

Last updated at Posted at 2025-12-31

はじめに

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

上記記事では、CSVテーブルの作成アクションを使用しています。
image.png

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

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を渡してもよいかもしれません。
個人的に活用法を見出したいです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?