【モダン Excel】Office スクリプト で Web API を呼び出す

# 🚀【モダン Excel】 Office スクリプト で Web API を呼び出す

## 📝 はじめに

Excel Online の自動化において、**Office Scripts** は TypeScript を用いたモダンなスクリプト環境として注目されています。
 `async / await` を利用した非同期処理や型安全性の恩恵により、Web API との連携が非常にシンプルかつ強力に実装できます。
 本レポートでは、**Office Scripts** を用いて GET および POST リクエストを行うサンプルコードをご紹介します。

------

## 🔎 VBA による Web API 呼び出しの復習

従来、Excel VBA では `WinHttpRequest` や `MSXML2.XMLHTTP` を利用して Web API にアクセスしていました。
 その詳細な実装方法については、以下の記事で詳しく解説されていますので、参考にしてください。

▶ **[VBA で Web API を呼び出す #WebAPI - Qiita](https://qiita.com/MakotoIshikawa/items/be902e6bd3fa2e5c5fe5)**

------

## ⚙️ Office Scripts の基本構造と API 呼び出し

**Office Scripts** は、Excel Online 上で TypeScript をベースに記述できる自動化スクリプト環境です。
 非同期処理が `async / await` により容易に記述できるため、最新の Web API との連携もスムーズに行えます。
 以下に、GET リクエストと POST リクエストのサンプルコードをそれぞれご紹介します。

### ✅ GET サンプルコード

以下は、`https://jsonplaceholder.typicode.com/todos` から Todo オブジェクトの配列を取得し、Excel シートに出力するサンプルコードです。

```typescript
// Office Scripts のエントリーポイント
async function main(workbook: ExcelScript.Workbook): Promise<void> {
  // 取得先 API の URL
  const url: string = "https://jsonplaceholder.typicode.com/todos";
  
  // fetch を使ってデータ取得
  const response: Response = await fetch(url);
  
  // Todo オブジェクトの型定義
  type Todo = {
    userId: number;
    id: number;
    title: string;
    completed: boolean;
  };
  
  // レスポンスを JSON に変換し、Todo の配列として扱う
  const todos: Todo[] = await response.json();
  
  // Excel シートに結果を出力する
  const sheet = workbook.getActiveWorksheet();
  
  // ヘッダーの出力： userId 、 id 、 title 、 completed
  sheet.getRange("A1").setValue("userId");
  sheet.getRange("B1").setValue("id");
  sheet.getRange("C1").setValue("title");
  sheet.getRange("D1").setValue("completed");
  
  let rowIndex: number = 2;
  // 各 Todo オブジェクトのプロパティをシートに出力
  todos.forEach((todo: Todo) => {
    sheet.getRange(`A${rowIndex}`).setValue(todo.userId);
    sheet.getRange(`B${rowIndex}`).setValue(todo.id);
    sheet.getRange(`C${rowIndex}`).setValue(todo.title);
    sheet.getRange(`D${rowIndex}`).setValue(todo.completed);
    rowIndex++;
  });
}
```

------

## 📤 POST サンプルコード

次に、入力データを Excel の **A1～A3** セルから取得し、`https://httpbin.org/post` に対する POST リクエストで送信、結果を C 列に出力するサンプルコードです。
 今回は、POST の処理を個別の関数に分けず、エントリーポイントの `main` 関数内にすべて記述しています。

```typescript
// Office Scripts のエントリーポイント
async function main(workbook: ExcelScript.Workbook): Promise<void> {
  // POST 先 API の URL（httpbin.org の POST エンドポイント）
  const url: string = "https://httpbin.org/post";
  
  // Excel からデータを取得（入力セルを A1、A2、A3 に変更）
  const sheet = workbook.getActiveWorksheet();
  const id = sheet.getRange("A1").getValue();
  const value = sheet.getRange("A2").getValue();
  const comment = sheet.getRange("A3").getValue();
  
  // リクエストボディを作成（JSON 形式に変換）
  const body: string = JSON.stringify({ id, value, comment });
  
  try {
    // fetch を使って POST リクエストを実行
    const response: Response = await fetch(url, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: body,
    });
    
    // HTTP ステータスのチェック
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    // レスポンス JSON を解析（httpbin.org は送信した JSON を "json" プロパティに返す）
    const jsonResponse: Record<string, unknown> = await response.json();
    
    // POST 成功時のメッセージと "json" 部分を C 列に出力
    sheet.getRange("C1").setValue("POST リクエストが成功しました");
    sheet.getRange("C2").setValue(JSON.stringify(jsonResponse.json));
  } catch (error) {
    // エラー発生時、エラーメッセージを C 列に出力
    sheet.getRange("C1").setValue("API 呼び出し時にエラーが発生しました");
    console.log("API 呼び出し時にエラーが発生しました:", error);
  }
}
```

------

## 🔄 VBA から Office Scripts への移行メリット

**Office Scripts** を利用することで、以下のようなメリットが得られます。

| 項目         | VBA                      | Office Scripts                   |
| ------------ | ------------------------ | -------------------------------- |
| 言語         | VBA                      | TypeScript                       |
| API 通信     | `WinHttpRequest` など    | `fetch` によるシンプルな実装     |
| 非同期処理   | 不可                     | `async / await` による簡単な実装 |
| クラウド環境 | ローカル                 | Excel Online で動作              |
| 保守性       | 手動のエラーハンドリング | 型安全性と自動補完の恩恵が大     |

------

## 🎯 まとめ

本レポートでは、**Office Scripts** を利用して Excel から Web API を呼び出す方法について、GET および POST リクエストの実装例をご紹介しました。

- GET サンプルでは、`https://jsonplaceholder.typicode.com/todos` から Todo の一覧を取得し、シートに展開する方法を示しました。
- POST サンプルでは、Excel の入力セル（A1～A3）からデータを取得し、`https://httpbin.org/post` に送信、結果を C 列に出力する方法を示しました。

これにより、**Office Scripts** の非同期処理や TypeScript による型安全性の恩恵を実感でき、Excel Online での自動化がさらに効率的に行えることが理解いただけるでしょう。
 ぜひ、業務の自動化やプロトタイピングにお役立てください。