🥷

Office スクリプト(TypeScript) で Excel からシュッと JSON を出力する

2023/11/09に公開

はじめに

Excel で受け取ったデータを JSON に変換したいと思ったこと、ありませんか?

自分はしばしばあるのですが、普段は TypeScript を使って開発することが多いため使い慣れていない VBA を使うのも意外と大変なので、今までは Google スプレッドシートにコピーして GAS で出力していました。

「excel json」などで検索すると Microsoft 公式の Office スクリプトに関するドキュメントが出てきて、そこには何やら TypeScript のサンプルコードが登場しているのですが、実際にやってみたという記事はあまりなく試しにやってみたところとても便利だったのでやりかたをまとめました。

https://learn.microsoft.com/ja-jp/office/dev/scripts/resources/samples/get-table-data

動作要件

Office スクリプトの使用には Office 365 Business などの商用または教育機関向けライセンスが必要で、インターネット接続が必須です。(2023年11月現在)

またデスクトップアプリ版での使用は具体的なリリース日は出てこないのですが こちらのスライド によると2020年10月~11月頃のリリースだそうですので、できるだけ最新版にアップデートしておくと良さそうです。

詳しくは公式ドキュメントをご確認ください。

https://learn.microsoft.com/ja-jp/office/dev/scripts/overview/excel

Excel のメニューに「自動化」タブが表示され、中に「Office スクリプト」が表示されていれば使用可能な状態なはずです。(以降、スクリーンショットは Mac 版のものです)

シュッと出力する方法

データ作成

データはなんでも良いのですが、例として都道府県コードを使います。

https://nlftp.mlit.go.jp/ksj/gml/codelist/PrefCd.html

コードを code、都道府県名を name としたいので、新しく作成したブックでそれぞれ1行目に入力し、2行目以降にデータをペーストします。

テーブルをコピーするとそのままいい感じに Excel シートにペーストできるはずですが、2列になっているので一列になおしておきましょう。

テーブル化

今回のスクリプトで JSON に出力するためのデータは通常のセルではなく「テーブル」になっている必要があります。

「挿入」タブより「テーブル」を選択し、入力したデータをテーブル化します。

このとき「先頭行をテーブルの見出しとして使用する」にチェックを入れておきます。

データの色が変わっていればテーブル化成功です。

Office スクリプト実行

データが準備できたらいよいよスクリプトを実行しましょう。

「自動化」タブから「Office スクリプト」を選択し、「テーブル データを JSON として返す」のサンプルコードを選択します。

「コードエディター」が表示されますが、ここで「実行」を押してもなにも表示されないので、「編集」を押します。(ここの「実行」は結果を Power Automate に渡す用途で使用されるようです)

コードが表示されている画面内で「実行」を押すと「出力」に結果が出力されるので、これをコピーする等して使いましょう。

どの程度のデータ量までこの方法が通用するかは一概には言えませんが、数千行程度であれば問題なく使用できるはずです。

補足

今回使用したサンプルコードは「Sheet1という名前のシートの最初のテーブルを参照する」という決め打ち処理なため、今回の手順通りであればたまたまスムーズに実行できますが、他のテーブルを参照したい場合は「スクリプトに名前を付けて保存」でサンプルコードを別名保存してから table の取得処理を変更しましょう。(サンプルコード内のコメントにも書いてあります)

ちなみにこのコードエディターは VSCode と似たような操作感で補完、関数の説明、エラー等を表示してくれるため、普段から VSCode を使用している方にとってはかなり快適に編集ができるはずです。

またサンプルコード内に TableData という interface が定義されており、今回はこれを編集していないため実際に処理されるデータと TypeScript の型定義が食い違っています。

interface TableData {
  "Event ID": string;
  Date: string;
  Location: string;
  Capacity: string;
  Speakers: string;
}

今回は JSON をコンソールに出力するだけだったのでエラーになりませんでしたが、間に処理を挟む場合は必要に応じて TableData も修正しましょう。

この方法が良いと感じたこと

Excel 上で全てが完結するため早い

今までは Google スプレッドシートにコピーして GAS で出力していましたが、それでもスプレッドシートと GAS を行ったり来たりする必要があり非効率なところがありました。
Office スクリプトでは Excel のデスクトップアプリ上でコードを書いて実行までできるのはとても体験が良いです。

JSON の構造を簡単に変更できる

今回、テーブルの見出しとして codename を入力しましたが、ここを編集するだけで簡単に JSON のキーを変更できます。
複雑な処理を挟みたいときも TypeScript によって自由に実装することができます。

目視でデータを確認しやすい

データ欠損や不整合などを確認したいとき、人間の目には JSON より Excel のほうが見やすいです。
条件付き書式や COUNTIF などを使ってビジュアライズも簡単にできるので、実際に作業していて Excel と TypeScript のメリットを最大限に享受でき、非常に効率がいいと感じました。

まとめ

Excel のデータに対して TypeScript でこんなにも簡単に処理を実行できるというのは個人的には革命です。
自分のような Web エンジニアにとって Excel はできれば避けたい存在だったのですが、 Office スクリプトを使うことで一気に馴染みやすいツールに生まれ変わると感じました。

またプログラミング初学者にとっても、環境構築や入出力の処理が最初から整っているので、学習材料として非常にとっつきやすいのではないかと可能性を感じています。

DX の文脈では脱 Excel をうたわれることも多いですが、 Excel も日々進化しており今後も Microsoft 365 Copilot などさらに発展することが見込まれるので、これからも Excel からは逃れられなさそうです。

GENDA

Discussion