「毎日同じExcel作業の繰り返し…」 「VBAは難しくて挫折した…」 「複数のファイルを一括処理したい!」 「クラウドでも自動化したい!」
こんな悩み、ありませんか?
Office スクリプトなら、これらすべてを解決できます! VBAより簡単で、クラウド対応、しかもPower Automateと連携して完全自動化も可能。
この記事を読めば、今日からExcelの単純作業から解放されます。 プログラミング未経験でも大丈夫!一緒に始めましょう。
Office スクリプトって何?VBAとの違いを理解しよう

Office スクリプト = Excelの新しい自動化ツール
【Office スクリプトの特徴】
・言語:TypeScript(JavaScriptの親戚)
・動作環境:Web版&デスクトップ版Excel
・保存場所:OneDrive(クラウド)
・共有:チーム全体で使える
・連携:Power Automateで完全自動化
VBAとOffice スクリプトの比較
項目 | VBA | Office スクリプト |
---|---|---|
学習難易度 | 難しい | 簡単 |
言語 | Visual Basic | TypeScript/JavaScript |
動作環境 | デスクトップのみ | Web&デスクトップ |
クラウド対応 | × | ○ |
共有のしやすさ | 難しい | 簡単 |
Power Automate連携 | × | ○ |
セキュリティ | マクロウイルスリスク | 安全 |
記録機能 | ○ | ○ |
実行速度 | 速い | 普通 |
結論:新しく始めるならOffice スクリプト!
こんな人におすすめ
☑ Excel作業を自動化したい初心者
☑ VBAが難しくて挫折した人
☑ チームで自動化を共有したい人
☑ クラウドでExcelを使う人
☑ Power Automateを活用したい人
必要な環境と準備
使える環境をチェック
対応しているExcel:
✓ Excel for the Web(無料でも可)
✓ Excel デスクトップ版(Microsoft 365のみ)
✓ Excel for Mac(Microsoft 365のみ)
× Excel 2019以前の買い切り版
× Excel Mobile
有効化の手順
1. Excel for the Webの場合:
特別な設定不要!
自動で使えるようになっています。
2. デスクトップ版Excelの場合:
1. Excelを開く
2. 「自動化」タブを確認
3. 表示されない場合:
ファイル → オプション → リボンのユーザー設定
→ 「自動化」にチェック
3. 組織で無効になっている場合:
管理者に連絡して有効化を依頼
Microsoft 365管理センターで設定変更が必要
最初の一歩:操作を記録してみよう!
ステップ1:記録の開始
1. Excelで「自動化」タブをクリック
2. 「操作を記録」をクリック
3. スクリプト名を入力(例:「初めてのスクリプト」)
4. 「記録」ボタンをクリック
ステップ2:実際に操作する
例:簡単な表の作成
1. A1セルに「商品名」と入力
2. B1セルに「価格」と入力
3. A2セルに「りんご」と入力
4. B2セルに「100」と入力
5. A1:B1を選択して太字にする
6. 背景色を黄色に変更
ステップ3:記録を停止
1. 「記録を停止」をクリック
2. コードエディターが開く
3. 自動生成されたコードが表示される!
生成されたコードを見てみよう
function main(workbook: ExcelScript.Workbook) {
// 現在のワークシートを取得
let worksheet = workbook.getActiveWorksheet();
// セルに値を設定
worksheet.getCell(0, 0).setValue("商品名");
worksheet.getCell(0, 1).setValue("価格");
worksheet.getCell(1, 0).setValue("りんご");
worksheet.getCell(1, 1).setValue(100);
// 範囲を取得して書式設定
let range = worksheet.getRange("A1:B1");
range.getFormat().getFont().setBold(true);
range.getFormat().getFill().setColor("FFFF00");
}
ポイント:
- 自動で綺麗なコードが生成される
- 日本語コメントを追加できる
- 後から編集も簡単
基本的なコードの書き方
Office スクリプトの基本構造
function main(workbook: ExcelScript.Workbook) {
// ここにコードを書く
// 1. ワークシートを取得
let sheet = workbook.getActiveWorksheet();
// 2. セルやレンジを操作
let cell = sheet.getCell(0, 0); // A1セル
// 3. 値や書式を設定
cell.setValue("Hello, World!");
}
よく使う基本操作
1. セルの値を取得・設定
// 値を設定
sheet.getCell(0, 0).setValue("テキスト");
sheet.getCell(0, 1).setValue(123);
sheet.getCell(0, 2).setValue(true);
// 値を取得
let value = sheet.getCell(0, 0).getValue();
console.log(value); // コンソールに出力
2. 範囲の操作
// 範囲を取得
let range = sheet.getRange("A1:C10");
// 範囲に値を一括設定
range.setValue("同じ値");
// 配列で複数の値を設定
let data = [
["名前", "年齢", "部署"],
["田中", 30, "営業"],
["鈴木", 25, "開発"]
];
sheet.getRange("A1:C3").setValues(data);
3. 書式設定
// フォント設定
range.getFormat().getFont().setBold(true);
range.getFormat().getFont().setSize(14);
range.getFormat().getFont().setColor("#FF0000");
// 背景色
range.getFormat().getFill().setColor("#FFFF00");
// 罫線
range.getFormat().getBorders().getEdgeTop()
.setStyle(ExcelScript.BorderLineStyle.continuous);
実践!すぐ使える便利スクリプト10選
1. データの自動整形
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getActiveWorksheet();
// データ範囲を自動検出
let dataRange = sheet.getUsedRange();
if (!dataRange) return;
// ヘッダー行を装飾
let headerRange = sheet.getRangeByIndexes(0, 0, 1, dataRange.getColumnCount());
headerRange.getFormat().getFont().setBold(true);
headerRange.getFormat().getFill().setColor("#4472C4");
headerRange.getFormat().getFont().setColor("white");
// 列幅を自動調整
dataRange.getFormat().autofitColumns();
// テーブル化
let table = sheet.addTable(dataRange, true);
table.setName("データテーブル");
}
2. 重複データの削除
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getActiveWorksheet();
let range = sheet.getUsedRange();
if (!range) return;
let values = range.getValues();
let uniqueRows: (string | number | boolean)[][] = [];
let seen = new Set<string>();
// ヘッダー行を保持
uniqueRows.push(values[0]);
// 重複チェック
for (let i = 1; i < values.length; i++) {
let rowKey = values[i].join("|");
if (!seen.has(rowKey)) {
seen.add(rowKey);
uniqueRows.push(values[i]);
}
}
// クリアして新しいデータを設定
range.clear();
sheet.getRangeByIndexes(0, 0, uniqueRows.length, uniqueRows[0].length)
.setValues(uniqueRows);
console.log(`重複を削除: ${values.length - uniqueRows.length}行`);
}
3. 月次レポート自動作成
function main(workbook: ExcelScript.Workbook) {
// 新しいシートを作成
let reportSheet = workbook.addWorksheet("月次レポート");
// タイトル設定
let today = new Date();
let title = `${today.getFullYear()}年${today.getMonth() + 1}月 売上レポート`;
reportSheet.getCell(0, 0).setValue(title);
reportSheet.getRange("A1:E1").merge();
reportSheet.getRange("A1").getFormat().getFont().setSize(16);
reportSheet.getRange("A1").getFormat().getFont().setBold(true);
// ヘッダー作成
let headers = ["日付", "商品名", "数量", "単価", "売上"];
reportSheet.getRangeByIndexes(2, 0, 1, 5).setValues([headers]);
// サンプルデータ追加(実際はデータシートから取得)
let sampleData = [
["2024/01/01", "商品A", 10, 1000, 10000],
["2024/01/02", "商品B", 5, 2000, 10000],
["2024/01/03", "商品C", 8, 1500, 12000]
];
reportSheet.getRangeByIndexes(3, 0, 3, 5).setValues(sampleData);
// 合計行追加
reportSheet.getCell(6, 3).setValue("合計:");
reportSheet.getCell(6, 4).setFormula("=SUM(E4:E6)");
// 書式設定
reportSheet.getUsedRange()?.getFormat().autofitColumns();
}
4. 条件付き書式の自動設定
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getActiveWorksheet();
let dataRange = sheet.getRange("B2:B100"); // 売上データの範囲
// 条件付き書式を追加
let conditionalFormat = dataRange.addConditionalFormat(
ExcelScript.ConditionalFormatType.cellValue
);
// 100万以上は緑
let highRule = conditionalFormat.getCellValue();
highRule.setRule({
formula1: "1000000",
operator: ExcelScript.ConditionalCellValueOperator.greaterThanOrEqual
});
highRule.getFormat().getFill().setColor("#C6EFCE");
// 50万未満は赤
let lowFormat = dataRange.addConditionalFormat(
ExcelScript.ConditionalFormatType.cellValue
);
let lowRule = lowFormat.getCellValue();
lowRule.setRule({
formula1: "500000",
operator: ExcelScript.ConditionalCellValueOperator.lessThan
});
lowRule.getFormat().getFill().setColor("#FFC7CE");
}
5. データ検証(ドロップダウンリスト)の設定
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getActiveWorksheet();
// ドロップダウンの選択肢
let options = ["承認", "却下", "保留", "再検討"];
// データ検証を設定する範囲
let range = sheet.getRange("D2:D100");
// データ検証ルールを作成
let validation: ExcelScript.DataValidation = {
rule: {
list: {
inCellDropDown: true,
source: options.join(",")
}
},
errorAlert: {
message: "リストから選択してください",
showAlert: true,
style: ExcelScript.DataValidationAlertStyle.stop,
title: "入力エラー"
}
};
// 適用
range.setDataValidation(validation);
}
Power Automateとの連携:完全自動化を実現!

Power Automate連携のメリット
・定期実行(毎日朝9時など)
・メール受信をトリガーに実行
・複数ファイルの一括処理
・Teams通知と連携
・承認フローとの組み合わせ
連携の基本手順
1. スクリプトの準備
function main(workbook: ExcelScript.Workbook,
inputData: string): string {
// Power Automateから値を受け取る
let sheet = workbook.getActiveWorksheet();
sheet.getCell(0, 0).setValue(inputData);
// Power Automateに値を返す
return "処理完了: " + inputData;
}
2. Power Automateでフロー作成
1. Power Automateを開く
2. 「作成」→「自動化したクラウドフロー」
3. トリガーを選択(例:「スケジュール」)
4. アクションを追加
5. 「Excel Online (Business)」を検索
6. 「スクリプトの実行」を選択
7. ファイルとスクリプトを指定
実用例:日次売上レポートの自動送信
function main(workbook: ExcelScript.Workbook): string {
let sheet = workbook.getWorksheet("売上データ");
// 今日の売上を集計
let today = new Date().toLocaleDateString();
let todayRow = findRowByDate(sheet, today);
if (todayRow === -1) {
return "今日のデータがありません";
}
let sales = sheet.getCell(todayRow, 2).getValue() as number;
let count = sheet.getCell(todayRow, 3).getValue() as number;
// レポート文字列を作成
let report = `
【日次売上レポート】
日付: ${today}
売上高: ${sales.toLocaleString()}円
販売数: ${count}件
平均単価: ${Math.round(sales / count).toLocaleString()}円
`;
return report; // Power Automateでメール送信
}
function findRowByDate(sheet: ExcelScript.Worksheet,
date: string): number {
let data = sheet.getUsedRange()?.getValues();
if (!data) return -1;
for (let i = 0; i < data.length; i++) {
if (data[i][0] === date) {
return i;
}
}
return -1;
}
エラー対処法:よくある問題と解決策
エラー1:「undefined」エラー
// 問題のコード
let range = sheet.getUsedRange();
let values = range.getValues(); // エラー!
// 解決策:null チェックを追加
let range = sheet.getUsedRange();
if (!range) {
console.log("データがありません");
return;
}
let values = range.getValues(); // OK
エラー2:インデックスエラー
// 問題のコード
let cell = sheet.getCell(100000, 0); // 範囲外!
// 解決策:範囲をチェック
let maxRow = sheet.getUsedRange()?.getRowCount() || 0;
if (rowIndex < maxRow) {
let cell = sheet.getCell(rowIndex, 0);
}
エラー3:型エラー
// 問題のコード
let value = sheet.getCell(0, 0).getValue();
let result = value * 2; // エラー!
// 解決策:型変換
let value = sheet.getCell(0, 0).getValue();
let numValue = Number(value);
if (!isNaN(numValue)) {
let result = numValue * 2;
}
ベストプラクティス:効率的なスクリプト作成
1. パフォーマンスの最適化
// 悪い例:セルを1つずつ処理
for (let i = 0; i < 1000; i++) {
sheet.getCell(i, 0).setValue(i); // 遅い!
}
// 良い例:配列でまとめて処理
let data: number[][] = [];
for (let i = 0; i < 1000; i++) {
data.push([i]);
}
sheet.getRangeByIndexes(0, 0, 1000, 1).setValues(data); // 速い!
2. エラーハンドリング
function main(workbook: ExcelScript.Workbook) {
try {
// メイン処理
processData(workbook);
console.log("処理成功");
} catch (error) {
console.log("エラー発生: " + error);
// エラー時の処理
createErrorLog(workbook, error);
}
}
3. 再利用可能な関数
// 汎用的な関数を作成
function formatAsTable(sheet: ExcelScript.Worksheet,
rangeName: string): ExcelScript.Table {
let range = sheet.getRange(rangeName);
let table = sheet.addTable(range, true);
// ヘッダー書式
let headerRange = table.getHeaderRowRange();
headerRange.getFormat().getFont().setBold(true);
headerRange.getFormat().getFill().setColor("#4472C4");
return table;
}
// 使い回し
let salesTable = formatAsTable(sheet, "A1:D100");
let inventoryTable = formatAsTable(sheet2, "A1:F50");
VBAからの移行ガイド
よく使うVBA関数の対応表
VBA | Office スクリプト |
---|---|
Range("A1").Value = "test" | sheet.getRange("A1").setValue("test") |
Cells(1, 1).Value | sheet.getCell(0, 0).getValue() |
ActiveSheet | workbook.getActiveWorksheet() |
Worksheets("Sheet1") | workbook.getWorksheet("Sheet1") |
Selection | workbook.getSelectedRange() |
MsgBox "Hello" | console.log("Hello") |
For Each cell In Range | for (let row of range.getValues()) |
VBAマクロの変換例
VBA版:
Sub FormatData()
Dim ws As Worksheet
Set ws = ActiveSheet
With ws.Range("A1:D1")
.Font.Bold = True
.Interior.Color = RGB(255, 255, 0)
End With
End Sub
Office スクリプト版:
function main(workbook: ExcelScript.Workbook) {
let ws = workbook.getActiveWorksheet();
let range = ws.getRange("A1:D1");
range.getFormat().getFont().setBold(true);
range.getFormat().getFill().setColor("#FFFF00");
}
学習リソースとコミュニティ

公式リソース
1. Microsoft Learn
- 無料のオンラインコース
- 段階的な学習パス
- 実践的な演習
2. 公式ドキュメント
- APIリファレンス
- サンプルコード集
- ベストプラクティス
3. GitHub サンプル
- Microsoft公式サンプル
- コミュニティ投稿
学習のロードマップ
【初級(1週間)】
✓ 記録機能を使ってみる
✓ 簡単な値の取得・設定
✓ 基本的な書式設定
【中級(2-3週間)】
✓ ループと条件分岐
✓ 関数の作成
✓ エラー処理
【上級(1ヶ月〜)】
✓ Power Automate連携
✓ 複雑なデータ処理
✓ 外部API連携
まとめ:今日から始めるOffice スクリプト!
Office スクリプトは、Excel作業を劇的に効率化する強力なツールです。
Office スクリプトの魅力:
- VBAより簡単で学習しやすい
- クラウド対応でどこでも使える
- Power Automate連携で完全自動化
- チーム共有が簡単
- 安全性が高い(マクロウイルスの心配なし)
今すぐ始められること:
1. 「自動化」タブを確認
2. 操作を記録してみる
3. 生成されたコードを見る
4. 少しずつ編集してみる
5. サンプルスクリプトを試す
次のステップ:
- 日常業務の中で自動化できる作業を探す
- 週に1つ新しいスクリプトを作る
- Power Automateとの連携に挑戦
- チームメンバーと共有
もう単純作業に時間を奪われる必要はありません。 Office スクリプトで、クリエイティブな仕事に集中できる環境を作りましょう!
Happy Scripting! 🚀
コメント