Office ScriptsでExcelを爆速自動化!複数セルへの一括書き込みと基本操作の完全ガイド
生徒
「仕事でExcelの大量のデータを更新しなきゃいけないんですけど、一つずつセルに書き込んでいると時間がかかってフリーズしちゃうんです。Office Scriptsでもっと速く処理する方法はありませんか?」
先生
「それは大変ですね。実はOffice Scriptsには、一つずつセルを触るのではなく、『一気にまとめて書き込む』という魔法のようなテクニックがあるんですよ。それを使えば、数百、数千のデータも一瞬で処理できます。」
生徒
「一気にまとめて! それはどうやって書けばいいんですか? プログラミングは全然やったことがないので、簡単なところから教えてほしいです!」
先生
「大丈夫ですよ。まずはセルの読み書きの基本から、処理を高速化するための『最適解』まで、初心者の方にも分かりやすく順番に解説していきますね。一緒にExcel自動化のプロを目指しましょう!」
1. Office Scriptsとは?
Office Scripts(オフィススクリプト)は、Microsoftが提供しているExcel Onlineやデスクトップ版Excelで利用できる最新の自動化ツールです。これまでExcelの自動化といえば「VBA(マクロ)」が有名でしたが、Office Scriptsはそれよりも新しく、Webブラウザ上でも安定して動作するのが大きな特徴です。
このツールでは、TypeScript(タイプスクリプト)というプログラミング言語を使用します。「プログラミング言語」と聞くと難しそうに感じるかもしれませんが、基本は「Excelに何をさせたいか」を命令文として書くだけです。例えば、「A1セルに『こんにちは』と書いて」といった指示をコードにするだけで、Excelがあなたの代わりに働いてくれます。
Office Scriptsを使う最大のメリットは、一度作ったスクリプトをボタン一つで実行できるだけでなく、Power Automateという別のツールと連携させることで、「毎日決まった時間に実行する」といった高度な自動化も可能になる点にあります。パソコン操作に慣れていない方でも、基本的な書き方さえ覚えれば、日々の単純作業から解放される強力な味方になります。
2. セルを操作するための基本用語を学ぼう
プログラミングを始める前に、Office Scriptsでよく使われる用語を「身近なもの」に例えて解説します。これを知っておくだけで、コードの内容がぐっと理解しやすくなります。
- ワークブック(Workbook): Excelファイル全体のことです。「本棚にある1冊のノート」だとイメージしてください。
- ワークシート(Worksheet): ノートの中にある「ページ」のことです。1つのファイルに複数のシートがある場合、どのページに書き込むかを指定する必要があります。
- レンジ(Range): 「範囲」のことです。特定のセル(例えばA1)や、複数のセルの集まり(A1からC10まで)を指します。
- メイン関数(main function): スクリプトが実行されるときに、最初に読み込まれる「命令の入り口」です。全てのプログラムはこの中に書きます。
これらの関係性を理解しておくと、コードの中で「workbook.getActiveWorksheet()」と出てきたときに、「今開いているノートの、現在のページを取得しているんだな」とイメージが湧くようになります。
3. 一つのセルに値を書き込む基本のコード
まずは、基本中の基本である「一つのセルに値を書き込む」方法を見てみましょう。これが全ての操作の土台となります。
function main(workbook: ExcelScript.Workbook) {
// 1. 今開いているシートを取得します
const sheet = workbook.getActiveWorksheet();
// 2. A1セルを指定して、そこに「Hello World」という文字を書き込みます
sheet.getRange("A1").setValue("Hello World");
// 3. B1セルには数字の「100」を書き込んでみます
sheet.getRange("B1").setValue(100);
}
このコードでは setValue という命令を使っています。これは「値をセットする」という意味です。文字を書き込みたいときは " "(ダブルクォーテーション)で囲むのがルールですが、数字の場合はそのまま書くことができます。このように、一つのセルに対して一つずつ命令を出すのが最もシンプルな書き方です。
4. セルの値を取得して計算してみよう
次に、セルにある値を読み取って(取得して)、それを使って計算した結果を別のセルに書き出す方法を学びましょう。これは、請求書の計算やデータの集計などでよく使うパターンです。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
// A1セルの値を取得して、変数「price」に保存します
let price = sheet.getRange("A1").getValue() as number;
// B1セルの値を取得して、変数「count」に保存します
let count = sheet.getRange("B1").getValue() as number;
// かけ算をして合計を出します
let total = price * count;
// 計算結果をC1セルに書き込みます
sheet.getRange("C1").setValue(total);
}
ここで登場した getValue は「値を取得する」という意味です。また、as number というのは「これは数字として扱いますよ」というOffice Scriptsへの合図です。Excel上にあるデータを読み取って、プログラムの中で加工し、またExcelに戻す。この流れが自動化の基本サイクルです。
5. 大量データを書き込むときの落とし穴:なぜ遅くなるのか?
さて、ここからが本題です。多くの初心者が陥る「罠」があります。それは、100個のセルに値を書き込むときに、先ほどの setValue を100回繰り返してしまうことです。
例えば、100行ある名簿を一行ずつループ(繰り返し処理)で書き込むと、Office Scriptsは「Excelに書き込む」という通信を100回行います。これを「チャットの返信を待つ」ことに例えてみましょう。
1つのメッセージを送って、相手の「既読」を確認してから次のメッセージを送る。これを100回繰り返すと、とても時間がかかりますよね? 一方、100行分の文章を一通の長いメッセージにまとめて送れば、通信は1回で済み、一瞬で終わります。Excel自動化の世界でも、これと同じことが起こります。一つずつのセル操作は、積もり積もって大きなタイムロス(遅延)となり、最悪の場合はスクリプトがタイムアウトで停止してしまいます。
6. 複数レンジへの高速書き込み!最適解の「二次元配列」とは?
大量のデータを高速で書き込むための最適解は、「二次元配列(にじげんはいれつ)」という仕組みを使って、一度にドカンと書き込むことです。二次元配列とは、簡単に言うと「表形式のデータのかたまり」のことです。
プログラミングでは、[ ] を使ってデータを囲みます。二次元配列は、行と列を表現するために [[行1のデータ], [行2のデータ]] という入れ子構造にします。これにデータを詰め込んで、setValues(最後に s がつく複数形!)という命令を使うのが、Office Scriptsで最も速い書き込み方法です。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
// 書き込みたいデータを「表」の形で準備します(二次元配列)
// 外側の[ ]が表全体、内側の[ ]が各行を表します
const data = [
["名前", "年齢", "役職"],
["田中", 25, "社員"],
["佐藤", 32, "マネージャー"],
["鈴木", 45, "部長"]
];
// 書き込む範囲の大きさを取得します
// data.length は「行数」、data[0].length は「列数」を表します
const rowCount = data.length;
const colCount = data[0].length;
// A1セルを起点にして、データのサイズ分だけの範囲を確保し、一気に書き込みます
const targetRange = sheet.getRangeByIndexes(0, 0, rowCount, colCount);
targetRange.setValues(data);
}
このコードの凄いところは、どんなにデータが増えても setValues を呼び出す回数は「1回だけ」という点です。1,000行のデータがあっても一瞬でExcelに反映されます。これが「高速書き込みの最適解」です。
7. 実践編:計算したデータを一括で書き込む応用技
最後に、より実用的な例を紹介します。既存のデータを読み込み、プログラム内で計算(加工)したあと、別の場所に一括で書き出す処理です。これができれば、日々のデータ集計業務が数秒で終わるようになります。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
// A1からB10までの数値を一括で読み込みます
const sourceRange = sheet.getRange("A1:B10");
const values = sourceRange.getValues();
// 計算後のデータを入れるための空の「箱」を準備します
let resultData: number[][] = [];
// 読み込んだデータを一行ずつ取り出して計算します
for (let i = 0; i < values.length; i++) {
let val1 = values[i][0] as number;
let val2 = values[i][1] as number;
// 足し算をして、結果を新しい行として追加します
let sum = val1 + val2;
resultData.push([sum]);
}
// 計算結果(C列)をまとめて書き込みます
const targetRange = sheet.getRange("C1").getResizedRange(resultData.length - 1, 0);
targetRange.setValues(resultData);
}
ここでは for 文という「繰り返し」の命令を使っていますが、大切なのは「ループの中で setValue をしない」ことです。ループの中では resultData.push を使ってデータを貯めるだけに留め、ループが終わってから最後に setValues でドカンと書き込んでいます。この手順を守ることが、Office Scriptsを使いこなす最大のコツです。
8. エラーを防ぐためのポイントと注意点
高速書き込みを行う際に、初心者がやってしまいがちなミスがいくつかあります。これを知っておくと、トラブルが起きたときも冷静に対処できます。
- データの形を揃える:
setValuesを使うときは、全ての行の列数が同じである必要があります。1行目が3列なのに、2行目が2列しかないとエラーになってしまいます。空のセルにしたい場合は""(空文字)を入れて、形を整えましょう。 - 範囲の大きさを合わせる: 書き込み先の
Range(範囲)の大きさと、用意したデータのサイズが一致していないとエラーになります。コードの中でgetResizedRangeやgetRangeByIndexesを使って、自動的に範囲を計算させるのが安全です。 - 読み取り専用に注意: 他の人が共有で開いているときなど、シートにロックがかかっていると書き込みに失敗することがあります。
これらのポイントを意識するだけで、スクリプトの安定性は格段に向上します。まずは小さなデータで試してみて、徐々に大きなデータを扱うようにステップアップしていきましょう。Office Scriptsは失敗してもExcelの「元に戻す」ボタンや、事前のバックアップがあれば怖くありません。どんどんチャレンジして、業務効率化を加速させてくださいね。