【Power Automate】Excel テーブルを YAML ファイルに変換する

# 【Power Automate】Excel テーブルを YAML ファイルに変換する

## 目的

Excel ブック内に存在するすべてのテーブルを、それぞれ YAML 形式に変換し、SharePoint ライブラリの指定フォルダに個別の YAML ファイルとして保存します。

:::note info
**Power Automate** (クラウドフロー) には、JSON 変換のアクションはありますが、YAML 変換のアクションは現状ありません。(2025/05 現在)
:::

**Office スクリプト**は Excel for the Web 上で実行される安全なサンドボックス環境のため、**Office スクリプト** 単体ではローカルファイルやクラウドストレージに直接ファイルを書き出すことはできません。**Office スクリプト** と **Power Automate** を連携させることで実現します。

## 処理の流れ

1. **Office スクリプト** で YAML 文字列を生成する
2. **Power Automate** で **Office スクリプト** を呼び出し、変換された YAML 文字列を元にファイルを作成し、SharePoint ライブラリに格納する

### シーケンス

```mermaid
 sequenceDiagram
    actor User
    participant pa as Power Automate
    participant xls as Excel Online<br>(Business)
    participant spl as SharePoint<br>ライブラリ

    User->>pa: フローを実行
    Note over pa: トリガー [フローを手動でトリガーする]
    Note over pa,xls: スクリプトの実行
    pa->>+xls: Office スクリプトを実行する
    loop 各テーブルごとに
        xls->>xls: テーブルのデータを YAML 文字列に変換
    end
    xls-->>-pa: YAML 文字列の配列を返す
    Note over pa: Apply to each
    pa->>pa: 各要素に適用
    loop 各テーブルの YAML 文字列ごとに
    	Note over pa,spl: ファイルの作成
        pa->>spl: YAML ファイルの作成する
    end 
```

## ステップ 1：Office スクリプトの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/021fc597-848a-4a18-b6cb-8e0d9d09496b.png)

Excel ブック内のすべてのテーブルを取得し、それぞれを YAML 形式に変換し、配列として返すスクリプトを作成します。

### スクリプトのポイント

- 空セルや null 値は `"null"` として出力
- ファイル名は `{テーブル名}.yaml`
- Power Automate で扱いやすいように配列形式で返す

```typescript
type TableInfo = {
    BaseName: string;
    FileName: string;
    Content: string;
};

function main(workbook: ExcelScript.Workbook): TableInfo[] {
    const tables = workbook.getTables();
    const result: TableInfo[] = [];

    for (const table of tables) {
        const yaml = convertTableToYAML(table);
        result.push({
            BaseName: `${table.getName()}`,
            FileName: `${table.getName()}.yaml`,
            Content: yaml
        });
    }

    return result;
}

function convertTableToYAML(table: ExcelScript.Table): string {
    const headers = table.getHeaderRowRange().getValues()[0];
    const rows = table.getRangeBetweenHeaderAndTotal().getValues();

    let yaml = "";

    rows.forEach((row) => {
        yaml += "- ";
        row.forEach((cell, colIndex) => {
            const key = headers[colIndex];
            let value: string;

            if (cell === null || cell === "") {
                value = "null";
            } else if (typeof cell === "string") {
                value = `"${cell}"`;
            } else if (typeof cell === "boolean") {
                value = cell ? "true" : "false";
            } else {
                value = cell.toString();
            }

            yaml += `${colIndex === 0 ? "" : "  "}${key}: ${value}\n`;
        });
    });

    return yaml;
}
```

## ステップ 2：Power Automate フローの作成

### 選択したファイルの場合

- **トリガー名**： 【モバイルのフロー ボタン】「フローを手動でトリガーする」

#### パラメーター：

- **場所**： SharePoint サイト
- **ドキュメント ライブラリ**： 対象のライブラリ

### スクリプトの実行

- **アクション名**：【Excel Online (Business)】「スクリプトを実行する」

#### パラメーター：

- **場所**： SharePoint サイト
- **ドキュメント ライブラリ**： 対象のライブラリ
- **ファイル**： Office スクリプトを作成したファイル名
- **スクリプト**： 上記で作成した Office スクリプト

### ファイルの作成

- アクション名：「**Apply to each (各要素に適用)**」
  - **前のステップから出力を選択します**：スクリプトの戻り値 (配列)
    `outputs('スクリプトの実行')?['body/result']`
- ループ内のアクション：「**ファイルの作成（SharePoint）**」
  - **サイトのアドレス**： 対象の SharePoint サイト
  - **フォルダー パス**： 例 `/Shared Documents/YAML`
  - **ファイル名**：`items('Apply_to_each')?['filename']`
  - **ファイル コンテンツ**：`items('Apply_to_each')?['content']`