🚀【モダン 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
⚙️ Office Scripts の基本構造と API 呼び出し
Office Scripts は、Excel Online 上で TypeScript をベースに記述できる自動化スクリプト環境です。
非同期処理が async / await
により容易に記述できるため、最新の Web API との連携もスムーズに行えます。
以下に、GET リクエストと POST リクエストのサンプルコードをそれぞれご紹介します。
✅ GET サンプルコード
以下は、https://jsonplaceholder.typicode.com/todos
から Todo オブジェクトの配列を取得し、Excel シートに出力するサンプルコードです。
// 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
関数内にすべて記述しています。
// 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 での自動化がさらに効率的に行えることが理解いただけるでしょう。
ぜひ、業務の自動化やプロトタイピングにお役立てください。