Office Scriptsの基本!Excel自動化でテーブル(ListObject)を操作するコードの書き方
生徒
「仕事でExcelの表を扱うことが多いんですが、Office Scriptsを使って特定の『テーブル』だけを狙って自動で操作することってできるんですか?」
先生
「もちろんです!Office Scriptsには『ListObject(リストオブジェクト)』という仕組みがあって、これを使うとExcel内のテーブルを名前で指定して、中身を並べ替えたり行を追加したりが自由自在にできるんですよ。」
生徒
「『ListObject』っていうのは、普通のセル操作とは違うんですか?」
先生
「良い視点ですね。普通のセル操作が『住所で家を探す』ようなものだとしたら、テーブル操作は『〇〇さんの家』と名前で呼ぶようなものです。データが増えても場所がズレても、確実に操作できるのがメリットです。基本から一緒に学んでいきましょう!」
1. Office Scriptsとは?
Office Scripts(オフィススクリプト)は、Microsoftが提供するExcel Onlineやデスクトップ版Excelで利用可能な、業務効率化のための自動化ツールです。プログラミング言語の「TypeScript(タイプスクリプト)」をベースにしており、一度書いたスクリプトはクラウド上に保存され、ボタン一つでいつでも実行できます。
Excelには昔から「VBA(マクロ)」という機能がありましたが、Office Scriptsはより現代的で、インターネット環境との親和性が高いのが特徴です。例えば、Microsoft Power Automateというツールと連携させることで、「毎日決まった時間にExcelのテーブルを更新する」といった高度な自動化もノーコードに近い感覚で実現できます。プログラムが初めての方でも、基本的なルールさえ覚えれば、明日からの事務作業を劇的にスピードアップさせることが可能です。
2. テーブル操作の主役「ListObject(リストオブジェクト)」を理解しよう
Excelで「挿入」タブから作成する「テーブル」機能。これをOffice Scriptsの世界ではListObject(リストオブジェクト)と呼びます。プログラミングにおいて、特定の役割を持つ塊(かたまり)のことを「オブジェクト」と呼ぶ習慣があるため、このような名前になっています。
なぜ、ただの「セル」ではなく「テーブル」として操作するのでしょうか?それは、データの範囲をプログラムが自動で認識してくれるからです。例えば、普通のセル操作では「A1からC10までをコピーする」と指示しますが、データが11行目に増えたとき、プログラムを書き直さなければなりません。しかし、テーブル(ListObject)として操作していれば、「テーブル内のデータを全部コピーする」と伝えるだけで、行が増えても減っても、常に正しい範囲を対象にしてくれます。これが「ListObject」を使う最大のメリットであり、実務で失敗しない自動化のコツです。
3. まずはここから!テーブルを取得する基本コード
プログラムを書くとき、まずは「どのテーブルを触るのか」をコンピュータに教えてあげる必要があります。これを「取得(ゲット)」と言います。以下のコードは、現在開いているシートにある特定の名前のテーブルを探し出す、最も基本的な書き方です。
function main(workbook: ExcelScript.Workbook) {
// 1. まずは操作したいシートを捕まえます
const sheet = workbook.getActiveWorksheet();
// 2. そのシートにある「Table1」という名前のテーブルを取得します
const myTable = sheet.getTable("Table1");
// 3. テーブルの名前をログ(実行結果)に表示してみましょう
console.log("取得したテーブルの名前は: " + myTable.getName());
}
解説:
・const(コンスト):これは「定数」といって、何かを入れる「箱」を作る魔法の言葉です。ここでは sheet という箱にシートを、myTable という箱にテーブルを入れています。
・getTable("テーブル名"):カッコの中に、Excel上で設定したテーブルの名前を書きます。デフォルトでは「テーブル1」や「Table1」となっていることが多いです。
4. テーブルに新しいデータを追加する方法
実務で一番多いのが、「一番下の行に新しいデータを書き加えたい」というケースです。手作業だと一番下までスクロールして入力しますが、Office Scriptsなら addRow(アド・ロウ:行を追加する)という命令一つで完了します。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
const myTable = sheet.getTable("売上表");
// テーブルの末尾に新しい行を追加します
// [ ] の中に、左から順番にデータを入れていきます
myTable.addRow(-1, ["2026/01/28", "りんご", 150]);
}
実行結果(イメージ):
売上表の一番下の行に「2026/01/28」「りんご」「150」というデータがパッと追加されます。
解説:
・addRow(-1, [...]):最初の「-1」は「一番最後に追加してね」という意味です。ここを「0」にすると、一番上に割り込んで追加されます。カッコの中の [ ] は配列(はいれつ)といい、複数のデータをセットにするための記号です。各項目をカンマ , で区切って書きましょう。
5. テーブルのデータを一気に読み込む
次に、テーブルの中に何が書いてあるかをプログラムに読み取らせる方法です。計算をしたり、特定の条件でデータを抽出したりする前に必ず行うステップです。getRangeBetweenHeaderAndTotal という少し長い名前の関数を使いますが、これは「見出し(ヘッダー)」と「合計行」の間の「データ部分だけ」を指す便利な言葉です。
function main(workbook: ExcelScript.Workbook) {
const table = workbook.getTable("在庫リスト");
// テーブルのデータ部分(中身だけ)をまるごと取得
const range = table.getRangeBetweenHeaderAndTotal();
// セルの値を2次元の表形式(値の塊)として取り出す
const values = range.getValues();
// 1行目の1列目のデータ(一番左上のデータ)をログに出してみる
console.log("左上のデータ: " + values[0][0]);
}
解説:
・getValues()(ゲット・バリュース):これはセルに書かれている「値」をプログラムが扱いやすい形式で一気に吸い上げる命令です。吸い上げた後は values[行][列] という形式で中身を指定できます。プログラミングの世界では、数は 1 からではなく 0 から数え始めるのがルールなので、1行目は [0] と書く点に注意しましょう。
6. テーブルの見た目を整える!並べ替えとフィルタ
大量のデータがあるとき、特定の条件で絞り込んだり、日付順に並べ替えたりする作業も自動化できます。Office Scriptsでは getSort(ソート:並べ替え)や getFilter(フィルター:抽出)といった機能が ListObject に備わっています。
function main(workbook: ExcelScript.Workbook) {
const table = workbook.getTable("社員名簿");
// 2列目(インデックスは1)を基準に「昇順(小さい順)」で並べ替える
table.getSort().apply([{
key: 1,
ascending: true
}]);
// 1列目(インデックスは0)で「東京」という文字が含まれるものだけ表示
table.getColumnByName("勤務地").getFilter().applyValuesFilter(["東京"]);
}
解説:
・apply(アプライ):これは「適用する」という意味で、設定した並べ替えのルールを実際に反映させる時に使います。
・ascending: true:これは「昇順」を意味します。逆に false にすると「降順(大きい順)」になります。
・getColumnByName:列の名前(見出し)を指定して、その列全体を操作できる非常に便利な命令です。
7. エラーを防ぐ!テーブルが存在するか確認するテクニック
プログラムを動かしたとき、もし「Table1」という名前のテーブルがシートに無かったら、エラーが起きてプログラムが止まってしまいます。これを防ぐために、事前に「テーブルはあるかな?」と確認する処理を入れるのが、プロ級の書き方です。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
const tableName = "売上データ";
// テーブルを探してみて、もし無かったらメッセージを出して終了する
const targetTable = sheet.getTable(tableName);
if (targetTable) {
console.log(tableName + " が見つかりました。処理を開始します。");
// ここにテーブルがある時の処理を書く
} else {
console.log(tableName + " が見つかりません。名前を確認してください。");
}
}
解説:
・if(イフ):もし~なら、という条件分岐の命令です。カッコの中が「存在する(真)」なら { } の中を実行し、そうでなければ else(エルス:それ以外)の処理に進みます。これがあるだけで、プログラムの信頼性がグッと高まります。
8. ListObject操作でよく使う便利な命令一覧
ここまで紹介した以外にも、テーブル操作でよく使う「呪文(メソッド)」がいくつかあります。これらを組み合わせて、より複雑な自動化に挑戦してみましょう。
| 命令(メソッド名) | 何ができる? |
|---|---|
addColumns |
右側に新しい列を追加します。 |
deleteRows |
指定した行を削除します。 |
getRange() |
見出しから合計行まで、テーブル全体の範囲を取得します。 |
setShowTotals(true) |
一番下に「合計行」を表示させます。 |
プログラミングを始めたばかりのときは、これらすべてを暗記する必要はありません。「こんなことができるんだな」と頭の片隅に置いておき、必要になったらこの記事を読み返したり、公式リファレンスを調べたりすれば大丈夫です。大切なのは、手作業で10分かかることを、プログラムで1秒にする楽しさを知ることです。
9. 初心者がつまずきやすいポイントと解決策
Office Scriptsでテーブルを操作しようとして、よく直面するトラブルがいくつかあります。まず一つ目は「名前の不一致」です。Excel上のテーブル名が「テーブル1」と全角なのに、コードの中で「Table1」と半角で書いてしまうと、コンピュータは別物だと判断してしまいます。大文字・小文字、全角・半角の違いには細心の注意を払いましょう。
二つ目は、セルの「形式」です。日付をテーブルに追加したとき、ただの数字として表示されてしまうことがあります。これはExcel側のセルの書式設定が原因であることが多いです。Office Scripts側で setNumberFormat を使って書式を整えることもできますが、まずはあらかじめExcelのテーブルの書式を「日付」や「通貨」に設定しておくと、プログラムからデータを流し込んだ際も綺麗に表示されます。
最後に、Office Scriptsは「保存」という作業を意識しなくても、実行した瞬間にExcelの内容が書き換わります。取り消し(Ctrl + Z)が効かない場合が多いため、大事なデータで試すときは、必ずファイルをコピーしてバックアップを取ってから練習するようにしましょう。失敗は成功のもとですが、データが消えてしまっては大変ですからね。