Office Scriptsの基本!関数分割で読みやすいExcel自動化コードを設計する方法
生徒
「Office Scriptsでコードを書いてみたんですが、長くなってきて自分でも何をしているのかわからなくなりました……」
先生
「それはよくある悩みですね。そんなときに役立つのが、関数分割という考え方です。」
生徒
「関数分割って、プログラミング初心者でもできますか?」
先生
「もちろんです。Excel作業を小さな作業に分ける感覚と同じなので、順番に理解すれば大丈夫ですよ。」
1. Office Scriptsとは?
Office Scriptsは、Excel Onlineで使える自動化の仕組みです。マウスで何度も同じ操作をしなくても、あらかじめ書いたコードを実行するだけで、Excelの作業を一瞬で終わらせることができます。セルに文字を書く、表を整える、計算をするなど、普段人が行っている操作をプログラムに任せるのが特徴です。
Office ScriptsではTypeScriptという言語を使いますが、難しい計算や専門知識がなくても、Excelの操作をそのまま文章にしたような感覚で書けるため、プログラミング初心者にも向いています。
2. なぜ関数分割が必要なのか
コードを一つの場所に全部書いてしまうと、後から見たときに「何をしているコードなのか」が分かりにくくなります。これは、説明書が一行でぎっしり書かれているような状態と同じです。
関数分割とは、作業ごとにコードを分ける考え方です。たとえば「文字を書く作業」「色を変える作業」「計算する作業」をそれぞれ別の関数にします。こうすると、どこで何をしているのかが一目で分かり、ミスも減らせます。
3. 関数とは何かをやさしく理解しよう
関数とは「決まった作業をまとめたもの」です。料理で例えると、「ご飯を炊く」「野菜を切る」といった作業を一つずつ分けて考えるイメージです。Office Scriptsでも同じで、Excelに文字を書く処理だけを一つの関数にまとめられます。
関数に名前をつけておくと、「この関数は何をするのか」が名前を見るだけで分かるようになります。これが読みやすいコード設計の第一歩です。
4. 関数を使わない場合のコード例
まずは、関数を分けずに全部まとめて書いた例を見てみましょう。初心者の方が最初に書きがちな形です。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
sheet.getRange("A1").setValue("商品名");
sheet.getRange("B1").setValue("価格");
sheet.getRange("A2").setValue("りんご");
sheet.getRange("B2").setValue(100);
}
このコードでも動きますが、行が増えると「何の処理なのか」を毎回読み直す必要があります。
5. 関数分割した読みやすいコード例
次に、同じ内容を関数分割して書いてみます。処理の意味が分かりやすくなります。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
writeHeader(sheet);
writeData(sheet);
}
function writeHeader(sheet: ExcelScript.Worksheet) {
sheet.getRange("A1").setValue("商品名");
sheet.getRange("B1").setValue("価格");
}
function writeData(sheet: ExcelScript.Worksheet) {
sheet.getRange("A2").setValue("りんご");
sheet.getRange("B2").setValue(100);
}
「見出しを書く」「データを書く」と分かれているので、コードの意味がすぐ理解できます。
6. 処理ごとに関数を分ける考え方
関数分割をするときは、「人が説明するときに区切る場所」を意識します。たとえば「最初に準備する」「次に入力する」「最後に整える」といった流れです。
Office Scriptsでは、セル操作、書式設定、計算処理などを分けると、初心者でも安心してコードを読めるようになります。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
setTitle(sheet);
setColor(sheet);
}
function setTitle(sheet: ExcelScript.Worksheet) {
sheet.getRange("A1").setValue("売上表");
}
function setColor(sheet: ExcelScript.Worksheet) {
sheet.getRange("A1").getFormat().getFill().setColor("#FFFFCC");
}
7. 関数分割でミスを減らすメリット
関数ごとに分けておくと、間違いが起きたときに直す場所がすぐ分かります。一つの大きなコードだと、どこを直せばいいのか探すだけで疲れてしまいます。
また、同じ処理を何度も使い回せるのも大きなメリットです。これはOffice Scriptsのコード管理でも重要な考え方です。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
writeMessage(sheet, "完了しました");
}
function writeMessage(sheet: ExcelScript.Worksheet, message: string) {
sheet.getRange("C1").setValue(message);
}
8. 初心者でも続けやすいコード設計のコツ
関数名は日本語の意味が分かる英単語を使い、短くシンプルにします。完璧な英語でなくても問題ありません。大切なのは、自分が後から見て理解できることです。
Office Scriptsでの関数分割は、Excel自動化を長く続けるための大切な基礎です。最初は少し手間に感じても、慣れてくると自然に書けるようになります。
まとめ
今回の記事では、Excel Onlineの自動化ツールであるOffice Scripts(オフィススクリプト)において、非常に重要となる「関数分割」の考え方と具体的な実装方法について詳しく解説してきました。プログラミング初心者の方が、最初にぶつかる壁の一つが「コードが長くなりすぎて、どこで何をしているのか分からなくなる」という問題です。この問題を解決する唯一にして最強の手段が、処理を小さな単位に切り分ける「関数分割」というテクニックです。
Office ScriptsはTypeScriptという言語をベースにしていますが、Excelの操作自体は私たちが普段手作業で行っている「セルに値を入力する」「書式を変更する」「表を作成する」といった動作の積み重ねです。これらの動作を一つの大きな塊(main関数)の中にすべて詰め込むのではなく、料理のレシピを「下準備」「調理」「盛り付け」と分けるように、プログラムも役割ごとに整理してあげることが、読みやすいコードへの近道となります。
Office Scriptsにおける関数分割の3つの大きな利点
関数分割を行うメリットは、単に見た目が綺麗になるだけではありません。実務でExcel自動化ツールを運用していく上で、以下の3つのポイントが非常に大きな意味を持ちます。
- 可読性の向上:main関数を見ただけで、そのスクリプトがどのような手順で動くのか(ワークフロー)が一目で把握できるようになります。
- 保守性の向上:もし「セルの色を変える処理」に間違いがあった場合、該当する関数だけを修正すれば済むため、他の正常に動いている部分を壊してしまうリスクを最小限に抑えられます。
- 再利用性:一度作成した「ヘッダーを作成する関数」や「ログを出力する関数」は、他の新しいスクリプトを作成する際にもコピー&ペーストで簡単に使い回すことができます。
さらに一歩進んだ実用的なサンプルコード
ここでは、学んだことを活かして、より実戦に近いコードを書いてみましょう。例えば、「売上データを用意し、特定の条件で書式を整え、最後に完了メッセージを表示する」という一連の流れを分割してみます。Office Scriptsの強みを活かした設計を意識しています。
/**
* メイン処理:全体の流れを管理する
*/
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
// 1. 表の土台を作る
setupTable(sheet);
// 2. データを流し込む
insertSalesData(sheet);
// 3. 見た目を整える
applyStyles(sheet);
}
/**
* 表の見出しを設定する関数
*/
function setupTable(sheet: ExcelScript.Worksheet) {
const headerRange = sheet.getRange("A1:B1");
headerRange.setValues([["商品名", "売上金額"]]);
}
/**
* サンプルの売上データを入力する関数
*/
function insertSalesData(sheet: ExcelScript.Worksheet) {
sheet.getRange("A2").setValue("Office Scripts ガイド");
sheet.getRange("B2").setValue(3500);
}
/**
* セルのスタイル(色や太字)を適用する関数
*/
function applyStyles(sheet: ExcelScript.Worksheet) {
const header = sheet.getRange("A1:B1");
// 背景色を薄い青色に設定
header.getFormat().getFill().setColor("#D9EAD3");
// 文字を太字にする
header.getFormat().getFont().setBold(true);
}
VBA経験者がOffice Scriptsへ移行する際のヒント
これまでExcel VBA(Visual Basic for Applications)でマクロを組んできた方にとって、Office Scriptsの関数分割は、VBAの「Subプロシージャ」や「Functionプロシージャ」を分ける感覚に非常に近いです。VBAでは以下のように書いていた処理を、TypeScriptの形式に書き換えるイメージを持つとスムーズに習得できます。
' VBAで処理を分けて書く場合のイメージ
Sub Main()
Call WriteHeader
Call WriteData
End Sub
Sub WriteHeader()
Range("A1").Value = "項目"
End Sub
Sub WriteData()
Range("A2").Value = "データ完了"
End Sub
このように、言語が違っても「良いコードの書き方」の本質は変わりません。Office Scriptsでは、引数(ひきすう)を使ってワークシート情報を渡す必要があるという点にだけ注意すれば、誰でもすぐに構造化された美しいコードが書けるようになります。まずは、3行以上の似たような処理が出てきたら「これは関数に分けられるかな?」と考えてみる癖をつけてみてください。
生徒
「先生、ありがとうございました!関数分割を意識するだけで、自分が書いたコードが急にプロっぽく見えてきて驚きました。今まで一つの関数に100行くらい書いていたのが嘘みたいです。」
先生
「それは素晴らしい気づきですね。コードを短く保つことは、未来の自分へのプレゼントでもあります。数ヶ月後にそのコードを読み返したとき、分割されていればすぐに内容を思い出せますから。」
生徒
「確かに、一気に全部書いていた時は、エラーが出るとどこが原因か探すだけで30分くらいかかっていました……。関数ごとに分かれていれば、特定の場所だけチェックすればいいんですね。」
先生
「その通りです。これをプログラミング用語で『デバッグが楽になる』と言います。また、Office Scriptsはクラウドで動くので、チームで共有することもありますよね。他の人が見たときに分かりやすいコードを書くことは、実務において非常に高く評価されるスキルなんですよ。」
生徒
「なるほど。まずは小さな処理から関数にする練習を続けてみます。関数名をつけるときに『これは何をするものか』を日本語でメモしてから、英語の関数名に直すとスムーズにいきそうです!」
先生
「良いアイデアですね。完璧な英語である必要はありません。`setColColor`(列の色を塗る)とか、自分が納得できる名前から始めてみましょう。Office Scriptsでの自動化がもっと楽しくなりますよ。」