Office Scriptsとは?VBAとの違い・できること/できないことを公式仕様で整理
Office Scripts(Officeスクリプト)は、Excelの操作をTypeScriptで記述して自動化する機能です。日本語の解説記事には「Excel on the web専用でデスクトップ版では動かない」と書かれたものが今も多く残っていますが、これは現行仕様では誤りです。Microsoftの公式ドキュメントは、Excel on the webに加えてExcel for Windows(バージョン2210以降)とExcel for Macを対応環境として明記しています。ここでは、VBAとの違い、対応する操作とランタイム上の上限、必要なライセンス、そしてPower Automateから実行したときに挙動が変わる落とし穴までを、公式仕様に沿って整理します。
まとめ
- 実体:Excel専用のクラウドベース自動化機能。言語はTypeScript(Office Scriptsが使うのはTypeScript 4.0.3)。WordやPowerPointでは使えません。
- 動作環境:Excel on the web/Excel for Windows 2210以降/Excel for Mac。iOS版Excelと、Web版以外のTeamsは対象外です。
- 利用条件:法人・教育機関向けライセンス(Office 365 Business、E1/E3/E5、F3、A3/A5など)とOneDrive for Businessが必要。個人・ファミリー向けサブスクリプションではプレビュー提供中です。
- VBAとの決定的な差:Office ScriptsはブックにしかアクセスできずCOM/OLEもイベント処理も持ちません。逆にPower Automateから呼び出せるのはOffice Scriptsだけです。
- 上限:1回のやり取りは5MB・500万セルまで。Power Automate経由では同期実行120秒でタイムアウトし、スクリプト実行は1ユーザーあたり1日1,600回までです。
- 要注意:Excelアプリ上では動く
fetchによる外部API呼び出しが、Power Automate経由の実行では必ず失敗します。
Office Scriptsの実体と、使い始めるための利用条件
TypeScriptで書き、ブックの外側に保存されるクラウド前提の自動化
スクリプトはTypeScriptで記述し、必ずExcelScript.Workbook型を第1引数に取るmain関数から始まります。この関数がスクリプトの入口で、外に書いたコードは実行されません。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
console.log(sheet.getName());
}
VBAのマクロがブックの中(.xlsm)に埋め込まれるのに対し、Office Scriptsのコードはブックとは別にOneDrive for Business上へ保存されます。ブックに関連付ければ、アクセス権のあるメンバーがブックからボタン一つで実行できます。マクロ付きファイルを配り歩く運用が要らなくなるのは、この保存場所の違いから来ています。
言語面の制約は無視できません。Office ScriptsのTypeScriptはバージョン4.0.3で固定されており、それ以降に入った言語機能は使えません。加えてany型は明示・暗黙とも禁止(let value;だけでもコンパイルエラー)、evalは非対応、Array.sortとジェネレーター関数はOffice Scripts APIと併用できず、配列メソッドのコールバックはアロー関数しか渡せません。Excel・ExcelScript・consoleは予約語で識別子に使えません。TypeScriptの型システムそのものを詳しく知りたい場合はTypeScript 6.0とは|新機能・5から6への移行手順とGo製7.0対応まで総まとめが参考になりますが、Office Scripts側は最新版に追随していない点を押さえておいてください。
ライセンスと動作環境の要件(デスクトップExcelでも動きます)
公式の「プラットフォームの制限、要件」ページが挙げる必須条件は次の4つです。
| 要件 | 内容 |
|---|---|
| アプリ | Excel on the web/Excel for Windows(2210以降)/Excel for Mac |
| ストレージ | OneDrive for Business(組織内共有リンクの有効化が必要) |
| ライセンス | 下記10プランのいずれか |
| 接続 | 接続されたエクスペリエンスが有効なインターネット接続 |
ライセンスとして認められるのは、Office 365 Business、Office 365 Business Premium、Office 365 ProPlus、Office 365 ProPlus デバイス用、Office 365 A3、Office 365 A5、Office 365 Enterprise E1、Office 365 Enterprise E3、Office 365 Enterprise E5、Office 365 F3 の10プランです。
ここで是正しておきたいのが「Business Standard以上が必要」「個人アカウントでは一切使えない」という説明です。公式のライセンス一覧にはE1やF3といった下位プランも含まれており、さらに個人・ファミリー向けMicrosoft 365ではMicrosoft 365 Insiderプログラムへの参加を条件にプレビュー提供されています。ただしPower AutomateからOffice Scriptsを呼ぶにはビジネスライセンスが必要で、E1とF3はPower Automateからの利用はできてもExcel内でのPower Automate直接統合はできません。
条件を満たしているのにExcelのリボンに「自動化」タブが出ない場合、原因は多くが環境側にあります。Excel on the webではブラウザーのサードパーティCookieが有効でないとタブが表示されず、プライベートブラウジングでは毎回設定し直す必要があります。条件付きアクセスで認証コンテキストを設定しているテナントでは、Excel on the webのOffice Scriptsがサポートされないため、Excel for WindowsまたはExcel for Macを使う必要があります。管理者が組織単位でOffice Scriptsをオフにしている可能性もあります。なおGCC High以上の政府機関向けクラウドでは非対応、Teams内でExcelを使う場合はTeams on the webでしかサポートされません。
VBAマクロとの違いと、VBAを残すべきかの判断基準
公式が示す機能差:クロスプラットフォームのクラウド vs デスクトップ
Microsoftは両者の関係を「VBAマクロはデスクトップ向け、Office Scriptsはセキュアでクロスプラットフォームのクラウド向けに設計されている」と説明しています。この設計思想の差が、そのまま機能差として現れます(以下はMicrosoftの比較ドキュメントに基づきます)。
| 観点 | Office Scripts | VBAマクロ |
|---|---|---|
| Excel on the web | 動作する | 動作しない |
| Excel以外のOffice製品 | 非対応 | 対応 |
| Power Automate | 呼び出せる | コネクタなし |
| COMアドイン/OLE | 不可 | 可能 |
| アクセス範囲 | ブックのみ | デスクトップ全体 |
| Excelのイベント | 非対応 | 対応 |
| ライセンス | 法人・教育向けが必要 | 不要(デスクトップ版に同梱) |
特に効いてくるのがイベント非対応です。Office Scriptsのスクリプトは、ユーザーが手動で起動したときか、Power Automateのフローが呼び出したときにしか動きません。「セルが変更されたら自動で走る」というVBAのWorksheet_Change的な処理は、Office Scripts単体では書けません。
VBAを残すべきケースの判断基準
移行を検討する現場では「VBAは古いから全部Office Scriptsへ」と発想しがちですが、次に当てはまるものは移行対象から外すべきです。判断を曖昧にすると、動かないものを作り直す時間を丸ごと失います。
- Excel以外のOfficeアプリを操作している:Word・PowerPoint・Accessを触るマクロは、Office Scriptsでは書き直せません。設計上Excel専用だからです。
- ローカルのファイルシステムや他アプリをCOM/OLEで操作している:Office Scriptsはブックの外に手が届きません。
- イベント駆動やUserFormでのユーザー入力に依存している:どちらもOffice Scriptsには存在しない概念です。
- 閉じたネットワークでオフライン運用している:Office Scriptsは接続されたエクスペリエンスが有効なインターネット接続を前提とします。
逆に、Web版Excelでも動かしたい、Power Automateで定時実行したい、マクロ付きファイルの配布とセキュリティ警告をやめたい、という動機ならOffice Scriptsが噛み合います。
VBA資産の移行手順と自動変換ツールの不在
「VBAをOffice Scriptsへ変換する」公式ツールはありません。VBAとTypeScriptは言語も実行モデルも別物で、書き直しは手作業です。ただし、VBAより単純になる面もあります。Office Add-insのJavaScript APIで必要だったload()/sync()の明示的呼び出しは、Office Scriptsでは不要です(同期はランタイムが自動で行います)。移行の現実的な手順は、対象のVBA処理をExcel上で手動操作として再現し、アクションレコーダーで記録して土台のコードを作り、そこから条件分岐やループを足していく流れになります。
VBA廃止時期の非公表と、移行を急ぐべき処理の見極め
「VBAはいつまで使えるのか」という問いに対する事実はひとつです。MicrosoftはVBAの廃止時期を公表していません。VBAはデスクトップ版Excelに引き続き同梱され、比較ドキュメントも「現時点では、VBAでは特にデスクトップクライアントで使用できるExcel機能のより完全なカバレッジが提供されている」と述べています。機能面でVBAが下位互換になったわけではありません。
とはいえ、周辺は確実に動いています。新しいOutlook on WindowsはVSTOアドインとCOMアドインをサポートせず、MicrosoftはOutlook Webアドインへの移行を案内しています。デスクトップのCOM前提という土台が崩れつつある以上、優先順位はこう置くのが合理的です。Web版Excelでも動かす必要がある処理、Power Automateで無人実行したい処理から先にOffice Scriptsへ寄せ、デスクトップ内で完結する既存VBAは急いで触らない。期限に追われて全面移行を計画するより、動作環境の要件が変わった処理だけを選んで移すほうが失敗しません。
Office Scriptsでできることと、できないことの境界
対応する操作範囲:セル・書式・テーブル・グラフ・ピボット
ExcelScript APIのオブジェクトモデルはExcelのUI構造に対応しており、ブック→ワークシート→範囲(Range)という階層でセルにアクセスします。Rangeは値・数式・書式の3つのプロパティを持ち、それぞれgetValues/setValues、getFormulas/setFormulas、getFormatで操作します。テーブル(addTable)、グラフ(addChart)、ピボットテーブル、図形、コメント、画像もAPIの対象です。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
const headerRange = sheet.getRange("B2:E2");
headerRange.setValues([["Product", "Quantity", "Unit Price", "Totals"]]);
headerRange.getFormat().getFill().setColor("#4472C4");
const dataRange = sheet.getRange("B3:D5");
dataRange.setValues([
["Almonds", 6, 7.5],
["Coffee", 20, 34.5],
["Chocolate", 10, 9.54]
]);
const totalRange = sheet.getRange("E3:E6");
totalRange.setFormulas([["=C3 * D3"], ["=C4 * D4"], ["=C5 * D5"], ["=SUM(E3:E5)"]]);
totalRange.setNumberFormat("$0.00");
sheet.addTable("B2:E5", true);
}
総計を入れたE6は、テーブル範囲(B2:E5)の外に置いています。テーブルに総計行を含めたい場合はTable.setShowTotalsを使ってください。
値を読み出すときは型の宣言が要ります。getValues()の戻り値はそのままでは計算に使えないため、priceRange.getValues() as number[][]のように型アサーションを付けます。anyが使えない以上、この一手間は避けられません。
Excel専用という制約(PowerPoint・Wordでは使えない)
「Office」という名前から他のOfficeアプリでも使えると誤解されがちですが、公式ドキュメントは「Office スクリプトは Excel でのみ使用できる」と明記しています。PowerPointのスライド生成やWordの差し込み文書をOffice Scriptsで自動化することはできません。Excel以外のOfficeアプリを含む自動化が必要なら、Power AutomateのアクションかOffice Add-ins、あるいはVBAを使うことになります。Power Automate側でできる範囲はPower Automateとは何か?その基本と概要を徹底解説で整理しています。
5MB・500万セルというデータ転送の上限
Excel on the webからスクリプトでブックを呼び出す場合、1回の要求・応答は5MBまで、範囲は500万セルまでという上限があります。超えると「応答ペイロードのサイズが制限を超えました」というエラーになります。大きな範囲を一度に扱うのではなく、複数の小さい範囲に分割するか、Range.getSpecialCellsで対象セルを絞り込むのが公式の回避策です。
行数の多いブックを1回のスクリプトで舐めきる設計は、この時点で破綻します。Excel上で大規模データ分析を回したいならPython in Excelとは?その概要や特徴、ビジネス活用の可能性を徹底解説、AIに集計や整形を任せたいならClaude for Excelの料金は?対応プラン・無料利用・アドイン導入を2026年最新版で解説のように、別の手段のほうが素直です。
最初のスクリプトを作るまでの手順とコードの書き方
アクションレコーダーによる記録と不要処理の削除
Excelの「自動化」タブからアクションレコーダーを起動すると、セルの編集・書式変更・テーブル作成といった操作がそのままスクリプトとして記録されます。スクリプト全体を保存せずコードだけ取り出したいときは「コードとしてコピー」ボタンを使います。
記録されたコードはそのまま使わないでください。手動操作の過程で発生した選択(select系)やアクティブ化の操作、途中でやり直した書式変更まで残っており、実行速度と可読性を落とします。残すのは「値を設定する」「書式を当てる」「テーブルを作る」といった結果に直結する行だけです。
コードエディターでの条件分岐とループの追加
アクションレコーダーでは記録できないのがif/elseやループです。ここからはコードエディターで書き足します。オブジェクトの有無を確認する際は、get系メソッドが対象を見つけられないとundefinedを返す性質を使います。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getWorksheets()[0];
const oldTable = sheet.getTable("MyTable");
// 既存テーブルがあれば作り直す(名前の衝突を避ける)
if (oldTable) {
oldTable.delete();
}
const newTable = sheet.addTable("A1:G10", true);
newTable.setName("MyTable");
}
外部データを取得するfetchの書き方と制限
Excelアプリ上で実行する場合に限り、fetchで外部のWebサービスからデータを取得できます。非同期処理になるためmainをasyncにし、戻り値をPromiseにします。anyが使えないので、受け取るJSONの構造に合わせたinterfaceの定義が必須です。
async function main(workbook: ExcelScript.Workbook): Promise<void> {
const fetchResult = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const json: JSONData = await fetchResult.json();
console.log(JSON.stringify(json));
}
interface JSONData {
userId: number;
id: number;
title: string;
completed: boolean;
}
ただし制約は厳しめです。OAuth2のサインインフローは使えず、APIキーは自前で管理するしかありません(資格情報を保管する仕組みがない)。localStorageやsessionStorage、document cookieも非対応です。取得先のCORS設定がAccess-Control-Allow-Origin: *でない場合、Office Scriptsランタイムのオリジンは予告なく変わるため呼び出しが失敗する可能性があります。そしてSharePointサイトに保存したスクリプトでは外部呼び出し自体がサポートされません。ローカルネットワーク宛のfetchは、Chromium系ブラウザでExcel on the webを使う場合、実行時にユーザーの許可プロンプトへの応答が必要になります。
Power Automate連携で挙動が変わる落とし穴
Office Scriptsの価値の多くはPower Automateとの組み合わせにありますが、Excel上で動いたスクリプトがフローでは動かないという事故が起きやすい領域でもあります。ここは日本語記事で体系的に触れられることが少なく、導入後に踏みやすい地雷です。
Power Automate実行時のfetch失敗
公式ドキュメントは明快です。「スクリプトが Power Automate を介して実行されると、外部 API 呼び出しは失敗します」。エラーは「ランタイム エラー: 行 X: フェッチが定義されていません」。Excelアプリ上でテストして通ったスクリプトを、そのままフローに組み込むと落ちます。外部サービスとのデータのやり取りが必要なら、スクリプト内のfetchではなくPower Automate側のHTTPアクションで取得し、その結果を引数としてスクリプトへ渡す設計にしてください。
120秒・1日1,600回・28.6MBという運用上の壁
| 制限 | 値 |
|---|---|
| 同期Power Automate操作のタイムアウト | 120秒 |
| スクリプト実行アクションの呼び出し | 1ユーザーあたり1日1,600回(UTC 0時にリセット) |
| スクリプトへ渡すパラメーターの最大サイズ | 30,000,000バイト(28.6MB) |
120秒は思ったより早く来ます。数万行の書き込みを1回のスクリプト呼び出しで済ませようとするとタイムアウトするため、公式はスクリプトの最適化か、複数回の呼び出しへの分割を推奨しています。また、ISO厳密形式で保存されたExcelブックはExcel Online(Business)コネクタの「スクリプトの実行」アクションでサポートされず、BadGatewayエラーになります。標準のブック形式で保存し直してください。
スケジュール実行機能の一時的な無効化
コードエディターから直接スケジュール実行を設定する機能は、現在一時的に無効化されています(既存のスケジュール済みスクリプトは引き続き実行されます)。新規に定時実行を組む場合は、Power Automateでスケジュールフローを作り、その中からスクリプトを呼び出す方法を取ります。「Office Scriptsだけで毎朝の自動更新ができる」と説明する記事は、この変更前の情報です。定型業務の自動化手段としてRPAと比較検討している場合は、OpenRPAとは?無料オープンソースRPAの使い方・インストール・対応OSも選択肢の整理に使えます。
よくある質問
Office ScriptsはPowerPointでも使えますか?
使えません。公式ドキュメントはOffice ScriptsのホストをExcelのみと明記しています。PowerPointやWordの自動化には、Office Add-ins(Web アドイン)やPower Automate、VBAを検討することになります。
個人のMicrosoftアカウントでも使えますか?
個人・ファミリー向けMicrosoft 365ではプレビュー段階として提供されています。Excel on the webまたはExcel for Microsoft 365を使い、Microsoft 365 Insiderプログラムへ参加することが条件です。安定運用が必要な業務用途では、法人・教育機関向けライセンスを前提にしてください。
デスクトップ版のExcelでも動きますか?
動きます。Excel for Windowsはバージョン2210以降、Excel for Macも対応しており、アクションレコーダーもこの2環境で利用できます。ただしWeb専用のAPIを含むスクリプトはデスクトップ版で実行できず、「このスクリプトは現在、Excel for the webで実行する必要があります」という警告が出ます。iOS版Excelは対応していません。
新しいOutlookのVBAが使えない問題の代替になりますか?
なりません。Office ScriptsはExcel専用のため、Outlookの自動化には使えません。新しいOutlook on WindowsはVSTOアドインとCOMアドインをサポートせず、MicrosoftはOutlook Webアドインへの移行を案内しています。メール契機でExcelを処理したいという要件であれば、Power Automateのメール受信トリガーからOffice Scriptsを呼ぶ構成が現実的です。
Web版のExcelでVBAマクロは動きますか?
動きません。Excel on the webはVBAマクロを実行できず、これがOffice Scriptsが用意された理由でもあります。.xlsmファイルをWeb版で開くこと自体は可能ですが、マクロは実行されません。Web版でも動かす必要がある処理は、Office Scriptsで書き直すことになります。