話題の記事

ウェブ版 Excel で使える新しい「Officeスクリプト」を試してみた

TypeScriptで書く、ExcelのWeb版で利用可能な「Officeスクリプト」はGASの代わりとなるのか?軽く見てみました。
2021.07.29

Guten Tag、伊藤です。

何気なく Web 版の Excel でスクリプトを使おうと見てみたら、GAS のようなサンプルスクリプトが出てきて驚きました。

「Office スクリプト」という TypeScript で記述できるスクリプト機能で、今年5月末にGAが開始したばかりなんですね!

しかし、同じエクセルファイルをアプリ版で開いてみると、従来のVBAが表示され、こちらのスクリプトエディタは表示されません。というのも、現時点で Web 版の Excel のみで利用可能な新機能なんですね。まさに Google スプレッドシートのスクリプトのようです。

ということで、今回は簡単に使ってみた内容を紹介します。

Officeスクリプトの始め方

まず、利用には商用ライセンスでウェブ版などの要件を満たしている必要があります。

現時点で要件として記載されているのは以下の通りです。

1. Excel on the web (デスクトップなどのその他のプラットフォームは、サポートされていません)。
2. OneDrive for Business。
3. Microsoft 365 Office デスクトップ アプリにアクセスできる、次のような商用または教育機関向けの Microsoft 365 ライセンス。
- Office 365 Business
- Office 365 Business Premium
- Office 365 ProPlus
- Office 365 ProPlus デバイス用
- Office 365 Enterprise E3
- Office 365 Enterprise E5
- Office 365 A3
- Office 365 A5

ソース:https://docs.microsoft.com/ja-jp/office/dev/scripts/overview/excel

要件が満たせていれば、Web 版 Excel の編集画面で Automate というメニューが表示されています。

  • Record Actions:いわゆるExcelやスプレッドシートのマクロの記録で、記録している間に行なったアクションを Office スクリプトに起こしてくれます。
  • ScriptsAll Scripts より、自分のスクリプトを作成したりサンプルスクリプトを編集・使用したりすることができます。

スクリプトの編集画面は次のようになっています。

構文エラーも動的に表示され、どの部分に問題があるか明確に表示されます。

個人的には、GASのように全画面で開いたりログの表示範囲を自由に変えられないのが少し窮屈に感じたのと、構文エラーのメッセージ内容が分かりづらかったり、関数などの予測入力がGASの方がまだまだ使いやすい印象を受けました。

なお、作成したスクリプトは、自分の OneDrive 内に Documents > Office Scripts というフォルダが作成されていて、その配下にファイルが配置されていました。

スクリプトは各エクセルファイルに紐づいているのではなく、自分の作成したすべてのスクリプトが、どのエクセルファイルのスクリプト一覧でも表示されるようになっていました。

もちろん OneDrive だけでなく Sharepoint 側の Web 版 Excel でも同様に Automate のメニューがあり、この場合も自分の OneDrive 内にあるスクリプトが一覧に表示されます。もし Sharepoint にあるようなエクセルファイルで他のユーザが自分のスクリプトを実行できるようにしたい場合には、スクリプトを共有することでそのエクセルファイルに紐づけて誰でも利用可能にできます。

共有されると、このようにアイコンに人のマークが付きます。

OfficeスクリプトとGASの違い

気になるのはやはり、Google Apps Script (GAS) とどう違うのか、今 GAS でやってることを Excel ファイルでもできるようになるのか、ということではないでしょうか。

基本的なところ

以下、基本的な名称の違いです。冒頭で宣言する時に、まずはこれを置き換える必要があります。範囲(range)やセル(cell)などは同じで、値の取得(getValue)などの基本的な関数も同じなので分かりやすいですね。

項目 Office Scripts GAS
ファイル全体 Workbook Spreadsheet
ファイル内のシート Worksheet Sheet

スクリプトの構成ですが、Office スクリプトでは必ず main() が実行され、引数には workbook オブジェクトというお作法が決まっています。一方の GAS では、任意の関数名を定義して、どこでも SpreadsheetApp を呼び出せます。

なお、ログ出力も console.logLogger.log で異なります。

office-script.ts

function main(workbook: ExcelScript.Workbook)
{
  // 現在のシートを取得
  let activeSheet = workbook.getActiveWorksheet();
  // 1つ目のシートを取得
  let firstSheet = workbook.getWorksheets()[0];
  // A1からB2の範囲を取得
  let range = activeSheet.getRange('A1:B2');

  // 現在のシート名をログ出力
  console.log(activeSheet.getName());
}

gas.gs

function myFunction() {
  // 現在のスプレッドシートを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // 現在のシートを取得
  var activeSheet = ss.getActiveSheet();
  // 1つ目のシートを取得
  var firstSheet = ss.getSheets()[0];
  // A1からB2の範囲を取得
  var range = activeSheet.getRange('A1:B2');

  // 現在のシート名をログ出力
  Logger.log(activeSheet.getName());
}

また、忘れてはならないのがスクリプト言語の違いです。GAS が JavaScript であるのに対し、Office スクリプトはその上位互換である TypeScript を使用します。私も JavaScript はかじった程度で Typescript は初心者なためざっと調べた限りですが、JavaScript からの互換性が高く同様の構文が使えるものの、変数のデータ型の設定など多少の新しい知識が必要となりそうです。

◆ 参考:TypeScriptとJavaScriptとの違い|Udemy メディア

公式のサンプルコードを参考にするにも、応用篇のものは解読が難しかったです...

応用的なところ

Office スクリプトは、現時点で Excel しか対応しておらず、Word など他のオフィスと連携することもできません。

今のところ Office スクリプトでできることは限られていて、GAS のようにスクリプトで HTML ファイルを作成して実行したり、ライブラリを追加して外部のツール、例えばS3などに通信するといったこともできず、基本的に Excel 内でデータを処理・出力するということしかできないようです。

ただし、作成したスクリプトは Microsoft の自動連携ツールである Power Automate で使用することができるため、スケジュール実行し、スクリプトで処理した出力内容をファイル化したりメールで送ったりといったことが Power Automate を通じて可能となります。

とはいっても、Power Automate でも S3 をサポートしていないので、本当は私は以下のブログのようなことをExcelでやりたかったんですが、当分は夢のようです。

おわり

ということで、まだ昨年リリースされて今年GAとなったばかりの機能のようなので、これからさらに機能が充実化されていくことを期待といったところでしょうか!

もし社内で Office 365 を使っていて、Excel のテーブルを処理して JSON ファイルで保存したいチャートを作成してメールで送りたいといった要望があったら、GAS を使わなくても VBA を学ばなくてもできるってことを思い出してください!

参考