本記事はQiita Advent Calender 2025 AEONおよびわたなべの19日目です!
19日目は、私渡邊が作成します!
本日はOffice Scriptについてです!
M365が本格的に全社導入され (ているという認識で大丈夫ですよね?) 、利用が現実的となったOffice Scriptを私見バリバリで紹介していきます!
![]()
わーい
Office Scriptとは
エクセルから動作させる自動化スクリプトです。
VBAとは違うのですか?と思った方。反省してください。
タイトルの文言も別にエッジを効かせたギャグのつもりではないです。
本気でそう思っています。
1. VBAとの違い
偉そうに言いながら私はVBA使ったことないんですけどね。
1.1. 簡単に壊されず流用しやすい
- VBAはマクロ形式の
.xlsmファイルに紐づく - office scriptは
.osts形式のスクリプトファイルに紐づく
つまりどういうことかといえば、好きなエクセルファイルから呼び出して使えます。
.ostsファイルがどこに配置されているかは各自の環境によるかと思いますが、私の場合は次の画像の通りでした。
マイファイル > ドキュメントに
Office Scriptsフォルダがありました
この中に作った
.ostsファイルがあります
つまり、
- スクリプトとして保存されるので、うっかり誰かが触って壊してしまったという事象の発生する確率が圧倒的に低いです
- 実行するエクセルを選ばないため、小規模な単位でよくある操作を自動化しておけば使いまわせます
- 他人への共有も簡単です
1.2. 書きやすい
Office ScriptはTypeScriptというノーコードツールでつくります。
そう、ノーコードツールです。
後述しますがコード書いてる感覚ありません。ポチポチ選ぶだけです。
さらに言えばLLMによる生成との相性も抜群です。その意味でもノーコードツールです。
![]()
次々と推論が効く様子はさすがTypeScriptですね。これはノーコードツールといって差し支えないでしょう
もちろんVBA自体も割と古くからある(枯れた)言語なので、AIで生成しやすく唐突なエラーも起きにくいかと思いますが、いろいろと仕様が古くなれた時の快適さはTypeScriptに軍配が上がります。
1.3. Office Scriptってweb版のExcelでしか動かないんじゃないですか?
と言われたことがあります。いや、ローカルで動きますよ。
え?一体いつからローカルで動くようになったのかですって?
では逆に聞きましょう。
「一体」が抜けてしまった。。。
普通にローカルで動きます。
厳密にランタイムがどこで実行されているか?などはちょっと調べないとわからないですが、ローカルで実行しても高速で動作するので少なくともweb上ということはなさそうです。
2. GAS(Google Apps Script)との違い
スプレッドシート形式のファイル上で動作するTypeScriptということで、Google Spreadsheet上で動作するJavaScript、GASを思い浮かべた方も多いかと思います。
もちろんMicrosoftとGoogleという違いはありますが
2.1. GASはサーバーをたてられる
これが大きいです。
Office Scriptは1回1回実行するスクリプトですが、GASはデプロイして常時稼働させることが可能です。
具体的にはサーバーを立ててdoGETやdoPOSTでHTTP requestを処理する、さらに具体的に言うとwebアプリケーションやLINE Botを実装することも可能です。
2.2. office scriptはPower Automateと連携できる
一方、office scriptはPower Automateと連携できるところがよいですね。M365の複数のアセットを連携して自動化できるところは明確な強みかと思います。
ビジネス用途でのシェアが高いMicrosoftならではですね。
Office Scriptを使ってみる
試しにどんなものか、office scriptを使ってみましょう。
エクセルの自動化タブを開きます。
![]()
このようなタブの中にいくつかのサンプルが表示されます
![]()
こんな感じのサンプルがいろいろ
試しに空の行数をカウントしてみましょう
クリックするとコードエディターというタブが右に開きます
![]()
➤実行を押しても特に何も起きていないように見えます。。。
ここで、実行を押しても何も起きないように見えますが、このスクリプトはカウントして結果を出力するタイプなので、何も起きていないように見えるのです。
アイコンをクリックすると、コードエディタが開きます。
![]()
この状態で
➤実行を押します
![]()
確認した範囲と、その中の空欄行数が出力されます
という感じで、右側のタブから実行できます。
Office Scriptを作ってみる
それでは実際に自分のやりたいことを、Office Scriptにして、簡単な作業を自動化してみましょう。
まずはTypeScriptの学習からスタートしていきます。
というのは一昔前の話。今は生成AIにお願いすればなんでもオッケーです!
1. 操作を記録する
嘘です。
もちろん全部生成してもよいのですが、細かな操作の詳細を言葉で伝えるのは意外と大変です。
それよりも操作を記録という機能があり、一番目立つタブの左に配置してあるので、これを活用しましょう。
![]()
操作を記録ボタンからスタートします
![]()
マクロと同じですが、操作を記録してくれます
終わったら■ 停止を押下
![]()
こんなに見やすく出力してくれます!
スクリプトとなっているところにお好きな名前を付ければ保存されます。
![]()
first_scriptと名前をつけました。無事保存されました。
あとは問題なく使いまわせます
2. エディタから修正する
上記のように、一旦操作を記録する形式で登録した後、エディタから修正することをお勧めします。
エディタから修正する方法は2通り。
- LLMで修正する
- 直接コーディングする
2.1. LLMで修正する
主な目的は汎用化です。
操作を記録した場合、
const sheetRange = sheet.getRange('A1', 'A7');
のような感じで、範囲などハードコーディングされています。
これでは、データを取得するごとに行数が変わる場合に対応できません。
これを修正するのに使いましょう。
現在、'A1', 'A7'のようにハードコーディングされている部分について、
データが存在する範囲を取得して、その部分を対象に太字にするように変更してください
というプロンプトを入力したのち、エディタに記載されているoffice scriptをコピペ。
出力されるコードを再度エディタに上書きする感じで修正しましょう。
このような修正方法を入れると、フローが可視化されたようなUIは使えなくなってしまいますが致し方ないですね。
2.2. 直接コーディングする
いちいちLLMに聞かなくてもかけるよ、というかたは直でコーディングしましょう。
裏話
本当はこの直接コーディングの項には列幅変更への対応を記載するつもりでした。
以前、office scriptを利用していた際、操作を記録時に変更した列幅と、後からoffice script経由で変更する列幅がズレるという事象が見られました。
そのため、列幅についてはLLMではなく微調整しながら手動で直しましょう、ということを書くつもりでいました。
ですが、実際に本日実行してみたところその不具合は修正されていたようです。さすがですね。
ちなみに、ワークフローのように記録されるUIも本日初めてみました。
M365は日々進化しているようです。
Office Scriptを共有する
共有は簡単。
-
.ostsファイルを共有して、所定の場所に配置してもらう - スクリプトを直接送って、エディタに貼り付けてもらう
これが楽かと。
ちなみに、.ostsファイルの中身を見ると単純な.tsファイルとは異なっており、テキストエディタ上にコードを記述して.osts形式で保存しても動作しません。
この点に注意いただければと思います。
ここまでVBA扱き下ろしておいていうのもなんなんですけど
office scriptはexcelでしか使えません。パワポなどでも使えることを考えると、VBAにも活躍の場はまだまだあると言って良いでしょう!
モダンな技術を追い求めるだけが全てではありません。枯れた安定感のある技術も大切にしながら、日々取り組んでいきましょう!
イオングループで、一緒に働きませんか?
イオングループでは、エンジニアを積極採用中です。少しでもご興味を持った方は、キャリア登録やカジュアル面談登録などもしていただけると嬉しいです。
皆さまとお話できるのを楽しみにしています!














