Google Apps Script

出典: フリー教科書『ウィキブックス(Wikibooks)』
Wikipedia
Wikipedia
ウィキペディアGoogle Apps Scriptの記事があります。

本書は初学者向けの「Google Apps Script(以下、GAS)」教本です。GASはGoogle Workspace(旧Google Apps, G Suite)に含まれ、Googleのアプリケーションにカスタム機能を追加するためのプログラミング言語です。JavaScriptベースであり、JavaScriptの基礎知識があれば比較的容易に学習できます。GASを利用することで、Googleアプリケーションの自動化や業務効率化が可能となります。

はじめに[編集]

Google Apps Script(GAS)は、Googleが提供するJavaScriptベースのスクリプト言語で、Google Workspace(旧 Google Apps, G Suite)との統合を可能にする強力な開発ツールです。 GASを使用すると、Googleのクラウドベースのオフィスアプリケーションと連携して、様々なタスクを効率的に自動化できます。このセクションでは、GASの特徴と開発環境について紹介します。

特徴[編集]

Google Apps Scriptの主な特徴は次の通りです。

Google Workspace との深い統合
GASは、GoogleのクラウドサービスであるG Suiteの機能に直接アクセスできるため、ドキュメント、スプレッドシート、フォーム、カレンダーなどのデータを簡単に操作できます。
JavaScriptベース
GASはJavaScriptに基づいており、JavaScriptの基本的な文法や機能を活かしてスクリプトを記述できます。これにより、広く普及しているJavaScriptの知識を利用して開発できます。
強力な自動化
GASを使用することで、定型的なタスクや繰り返し作業を自動化できます。トリガーを設定して定期的に実行することも可能です。
オープンソースライクな共有
GASで作成したスクリプトは、他のユーザーと簡単に共有できます。公開範囲を設定して、他の開発者と協力してスクリプトを改良することもできます。

開発環境[編集]

Google Apps Scriptの開発は、ウェブブラウザ上に提供されるスクリプトエディタを通じて行います。 このエディタはシンプルで使いやすく、スクリプトの作成、デバッグ、トリガーの設定などが容易に行えます。 また、GASはGoogle Drive上でスクリプトを保存し、いつでもアクセスできるようにします。 JavaScriptの基本的な理解があれば、開発者は迅速かつ効果的にスクリプトを構築できます。

Google Apps Scriptクイックツアー[編集]

Google Apps Scriptのクイックツアーでは、Google Apps Scriptを使用してGoogle Workspace のアプリケーションと連携する基本的な手順を学びます。以下は、簡単なクイックツアーのステップバイステップの概要です。

ステップ1: 新しいプロジェクトの作成[編集]

  1. Googleドライブを開きます。
  2. ドライブの左上にある「新規」ボタンをクリックし、その下から「その他」→「Google Apps Script」を選択します。

ステップ2: ファイルの設定[編集]

  1. スクリプトエディタが開かれるので、新しいスクリプトファイルを作成します。これはスクリプトのエントリポイントとなります。
  2. ファイルに名前を付けます。例えば、MyScriptなど。
  3. ファイルに以下のコードを書きます:
    const myFunction() => Logger.log('Hello, Google Apps Script!');
    

ステップ3: 関数の実行[編集]

  1. スクリプトエディタのメニューから「実行」→「myFunction」を選択します。
  2. 実行が初めての場合、許可を求められます。安全であると確認して許可してください。
  3. スクリプトのログ(View → Logs)に "Hello, Google Apps Script!" が表示されます。

ステップ4: Google Sheetsとの連携[編集]

  1. 新しい関数を追加して、Google Sheetsに値を書き込むスクリプトを作成します:
    function writeToSheet() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      sheet.getRange('A1').setValue('Hello from Apps Script to Sheets!');
    }
    
  2. 関数を実行し、Google Sheetsを開いてセルに値が書き込まれたか確認します。

ステップ5: トリガーの設定[編集]

  1. スクリプトエディタで「編集」→「現在のプロジェクトのトリガー」を選択します。
  2. 「トリガーを追加」をクリックして、定期的な実行などのトリガーを設定します。

これで、簡単なGoogle Apps Scriptのクイックツアーが完了しました。これをベースにして、Google Workspaceの他のサービスとの連携や、より複雑なスクリプトを開発していくことができます。公式ドキュメントやサンプルコードも参照するとより深く理解できます。


実行手順[編集]

説明を簡単にするため、Google スプレッドシートから Google Apps Script (GAS)を呼び出した場合として説明します。

まず、「拡張機能」>「Google Apps Script」を選ぶことで、GASを呼び出せます。


すると、次のようにスクリプト入力タブが新たに開きます。


スクリプト入力画面が開いたばかりのところ


ただし、これはまだGAS編集画面を開いただけにすぎず、何の命令もしてないので、何も起こりません。

では、これから命令を追記していって、GASを実行してみましょう。

手始めに「Hello World!」とログに表示するプログラムを作ってみます。


function myFunction() {
  Logger.log("Hello World!");
}

となるように追記します。

この段階では、まだ何も保存していないので、実行できません。


なお、上記コードと右のスクリーンショットでコードの文字色が違うのは、wikiのサーバーの設定とgoogleのサーバーの設定とが異なるためです。特に深い意味はありません。


保存のため、「プロジェクトを保存」を実行してください。コード入力部の上にあるアイコン一覧に、よく探すと「プロジェクトを保存」アイコンがあります。アイコンにマウスカーソルを当てると「プロジェクトを保存」というメッセージが出てくるので、そのアイコンを押すだけです。

「プロジェクトを保存」アイコンを押せば、実行ができるようになります。


実行は、再生ボタンみたいなアイコンです。


上述のコードの場合、実行すると右のような画面になります。

(おわり)

言語仕様[編集]

Google Apps Script(GAS)はJavaScriptを基にしていますが、一部の機能が独自のものとなっています。 以下に、Google Apps Scriptで使用可能なJavaScriptの基本的な構文と、GAS固有の機能に焦点を当てます。

使用可能なJavaScriptの基本的な構文[編集]

  1. 変数とデータ型
    変数はデータを格納するために使用され、JavaScriptの基本的なデータ型(String、Number、Booleanなど)をサポートしています。
    // 変数の宣言と初期化
    const message = "Hello, Google Apps Script!";
    const numberValue = 42;
    const isTrue = true;
    
    // ログに変数の値を表示
    Logger.log(message);
    Logger.log(numberValue);
    Logger.log(isTrue);
    
    条件分岐とループ
    条件分岐やループはJavaScriptと同様に使用できます。
    // 条件分岐
    if (numberValue > 50) {
      Logger.log("Number is greater than 50");
    } else {
      Logger.log("Number is 50 or less");
    }
    
    // ループ
    const ary = ["apple", "banana", "cherry"];
    for (const element of ary) {
      console.log(element); 
    }
    
    関数の定義
    関数は処理をまとめて再利用可能にします。
    // 関数の定義
    function greet(name) {
      Logger.log("Hello, " + name + "!");
    }
    
    // 関数の呼び出し
    greet("John");
    
    配列とオブジェクト
    配列やオブジェクトもサポートされています。
    // 配列
    const fruits = ["Apple", "Banana", "Orange"];
    Logger.log(fruits[1]);  // "Banana"
    
    // オブジェクト
    const person = { name: "Alice", age: 30, isStudent: false };
    Logger.log(person.name);  // "Alice"
    

これらの基本的な構文とGoogle Apps Script固有の機能を組み合わせて、Googleのクラウドベースのアプリケーションを効果的に操作できます。Google Apps Scriptの公式ドキュメントやサンプルコードも参照するとより理解が深まります。

WebブラウザのJavaScriptとの違い[編集]

Google Apps Script(GAS)はJavaScriptをベースにしていますが、ブラウザ上で一般的に利用されるJavaScript(特にWebブラウザ環境)とはいくつかの違いがあります。以下は、ブラウザのJavaScriptに存在するがGASのJavaScriptにはない主な機能や要素です。

DOM操作
GASでは、HTML文書のDOM(Document Object Model)にアクセスする機能が制限されています。ブラウザのJavaScriptでは、Webページ上の要素を直接操ることができるが、GASではGoogle Workspaceとの統合が中心であり、DOMの直接的な操作はありません。
画面描画
GASはバックエンドスクリプトとして機能し、直接的な画面描画やユーザーインタラクションの処理はサポートしていません。一方で、ブラウザ上のJavaScriptはフロントエンドで動作し、ユーザーとの対話やWebページのダイナミックな更新を可能にします。
Web APIの一部
ブラウザ上のJavaScriptは、Web API(例: Fetch API、WebGL、Web Speech API)を利用して、ユーザーエージェントやブラウザの機能にアクセスできます。これらのAPIはGASではサポートされていない場合があります。
ブラウザイベント
ブラウザのJavaScriptは、ユーザーの操作に対するイベント(例: クリック、キー入力)に反応することができます。GASでは、ユーザーインタラクションは主にGoogle Workspaceのサービスと連携したスクリプトの実行として行われます。
ローカルファイルの読み書き
ブラウザのJavaScriptは、ユーザーのコンピュータ上のファイルにアクセスするための機能を提供しますが、GASではこれが直接サポートされません。代わりに、Google DriveやGoogle SheetsなどのGoogle Workspaceのサービスを介してファイルを操作します。
スクリプト実行環境
ブラウザのJavaScriptは、ユーザーがWebページを閉じたり別のページに移動したりしても実行を継続できます。対照的に、GASのスクリプトはGoogle Workspace上で実行され、トリガーによって実行されることがありますが、ユーザーアクションに依存することは少ないです。

これらは、ブラウザ上のJavaScriptとGoogle Apps Scriptの違いの一部です。GASは主にGoogle Workspaceとの連携や自動化を目的としており、ブラウザ上のJavaScriptとは用途が異なります。

また、おなじくバックエンドスクリプトを実行する Node.js とは似た制約ですが、Nodejs には Console API が実装されており、console.log("Hello"); のようにメッセージの表示などが出来ますが、GASにはConsole API は実装されておらず、かわって Loggerオブジェクトを使います。

RhinoエンジンからV8エンジンへの移行
Google Apps Script (GAS) は、RhinoエンジンからV8エンジンへの移行を行いました。以下は、RhinoとV8の違いとその注意点についての概要です。
  1. エンジンの変更:
    Rhino
    Google Apps Scriptは以前、JavaScriptエンジンとしてRhinoを使用していました。RhinoはMozillaによって開発されたJavaScriptエンジンで、Javaで実装されています。
    V8
    Google Apps Scriptは現在、V8エンジンを使用しています。V8はGoogle Chromeで使用されている高性能なJavaScriptエンジンで、C++で実装されています。
  2. 実行速度の向上:
    Rhino
    Rhinoは相対的に遅いとされ、大規模なスクリプトや操作に対して性能の課題があった。
    V8
    V8は高速で効率的なエンジンであり、実行速度が向上しました。これにより、スクリプトの処理がより迅速に行われます。
  3. 新しい機能のサポート:
    Rhino
    Rhinoは古いJavaScript仕様をサポートしており、一部の新しい機能や標準規格に対応していませんでした。
    V8
    V8はより新しいECMAScript規格(ES6以降)に準拠しており、より多くの新しい機能や言語の進化に対応しています。
  4. ES6+ 機能のサポート:
    Rhino
    ES6以降の新しいJavaScript機能(アロー関数、テンプレートリテラルなど)のサポートが限定的でした。
    V8
    V8はES6以降の機能を広くサポートしており、より現代的で効果的なコーディングが可能です。
  5. 注意点:
    Google Apps ScriptのRhinoからV8への移行に伴い、一部のスクリプトで互換性の問題が発生する可能性があります。特に、Rhinoで動作していたがV8でエラーが発生する場合があります。

一部の既存のスクリプトがV8エンジンに適応されるまでに調整が必要な場合があります。これは、特に古いスクリプトやRhino固有の機能に関連しています。

V8エンジンの導入により、スクリプトのパフォーマンスが向上する一方で、一部の挙動が変更される可能性もあります。これにより、既存のスクリプトが意図せず影響を受けることがあります。

GoogleはRhinoからV8への移行を進めており、新しい機能や改善がV8エンジンに反映されています。移行に伴う変更やアップデートは、Google Apps Scriptのドキュメントやリリースノートで確認することが重要です。


Google Apps Script オブジェクト[編集]

Google Apps Script(GAS)では、様々なGoogleサービスと連携するために使用できる通常のJavaScriptにないオブジェクトが提供されています。

SpreadsheetApp[編集]

SpreadsheetApp オブジェクトは、Google Sheets(スプレッドシート)を操作するためのメソッドやプロパティを提供します。これを使用して、スプレッドシートのデータの取得や更新、新しいスプレッドシートの作成などが可能です。

使用例
// 新しいスプレッドシートを作成する例
function createNewSpreadsheet() {
  const newSpreadsheet = SpreadsheetApp.create('New Spreadsheet');
  Logger.log('Spreadsheet ID: ' + newSpreadsheet.getId());
}

この例では、SpreadsheetApp.create() メソッドを使用して新しいスプレッドシートを作成し、そのスプレッドシートのIDをログに出力しています。

DriveApp[編集]

DriveApp オブジェクトは、Google Drive(ドライブ)上のファイルやフォルダを操作するためのメソッドやプロパティを提供します。ファイルやフォルダの作成、取得、削除などが可能です。

使用例
// 新しいフォルダを作成する例
function createNewFolder() {
  const newFolder = DriveApp.createFolder('New Folder');
  Logger.log('Folder ID: ' + newFolder.getId());
}

この例では、DriveApp.createFolder() メソッドを使用して新しいフォルダを作成し、そのフォルダのIDをログに出力しています。

GmailApp[編集]

GmailApp オブジェクトは、Gmail(電子メール)アカウントのメールを操作するためのメソッドやプロパティを提供します。メールの送信、受信、削除などが可能です。

使用例
// メールを送信する例
function sendEmail() {
  const recipient = 'recipient@example.com';
  const subject = 'Test Email';
  const body = 'This is a test email.';
  GmailApp.sendEmail(recipient, subject, body);
}

この例では、GmailApp.sendEmail() メソッドを使用してテスト用のメールを送信しています。

CalendarApp[編集]

CalendarApp オブジェクトは、Google Calendar(カレンダー)を操作するためのメソッドやプロパティを提供します。予定の作成、取得、削除などが可能です。

使用例
// 新しい予定を作成する例
function createNewEvent() {
  const calendar = CalendarApp.getDefaultCalendar();
  const event = calendar.createEvent('New Event', new Date('2025-01-01T12:00:00'), new Date('2025-01-01T14:00:00'));
  Logger.log('Event ID: ' + event.getId());
}

この例では、CalendarApp.getDefaultCalendar().createEvent() メソッドを使用して新しい予定を作成し、その予定のIDをログに出力しています。

UrlFetchApp[編集]

UrlFetchApp オブジェクトは、Google Apps Scriptで外部のURLからデータを取得するためのメソッドやプロパティを提供します。これを使用することで、外部APIとの連携やWebサイトからデータの取得が可能です。

使用例
// 外部APIからデータを取得する例
function fetchDataFromAPI() {
  const apiUrl = 'https://api.example.com/data';
  const response = UrlFetchApp.fetch(apiUrl);
  
  Logger.log('Response Code: ' + response.getResponseCode());
  Logger.log('Response Content: ' + response.getContentText());
}

この例では、UrlFetchApp.fetch() メソッドを使用して外部APIからデータを取得し、取得したデータのHTTPレスポンスコードとコンテンツをログに出力しています。

PropertiesService[編集]

PropertiesService オブジェクトは、Google Apps Scriptのプロパティを管理するためのメソッドやプロパティを提供します。スクリプトの実行間でデータを保持したり、設定を保存したりするのに使用されます。

使用例
// スクリプトプロパティにデータを保存する例
function saveDataToProperties() {
  const properties = PropertiesService.getScriptProperties();
  properties.setProperty('apiKey', 'your_api_key');
}

// スクリプトプロパティからデータを取得する例
function getDataFromProperties() {
  const properties = PropertiesService.getScriptProperties();
  const apiKey = properties.getProperty('apiKey');
  Logger.log('API Key: ' + apiKey);
}

この例では、PropertiesService を使用してスクリプトプロパティにデータを保存し、その後取得してログに出力しています。

ScriptApp[編集]

ScriptApp オブジェクトは、Google Apps Scriptのプロジェクト全体に関するメソッドやプロパティを提供します。プロジェクトの設定や管理、スクリプトのプロパティなどに使用されます。

使用例
// スクリプトのプロパティを設定する例
function setScriptProperties() {
  ScriptApp.getProjectTriggers().newTrigger('myFunction').timeBased().everyDays(1).create();
}

// スクリプトのプロパティを取得する例
function getScriptProperties() {
  const timeZone = ScriptApp.getProjectTimeZone();
  Logger.log('Script Time Zone: ' + timeZone);
}

この例では、ScriptApp.getProjectTriggers() を使用して新しいトリガーを作成し、また ScriptApp.getProjectTimeZone() を使用してスクリプトのプロジェクトのタイムゾーンを取得しています。

Logger[編集]

Logger は、Google Apps Scriptのデバッグやログ出力のために使用される組み込みのオブジェクトです。 ログはGoogle Apps Scriptエディタ内で確認できます。

使用例
// ログにメッセージを出力する例
function logMessage() {
  Logger.log('This is a log message.');
}

この例では、Logger.log() を使用して単純なログメッセージを出力しています。ログはGoogle Apps Scriptエディタの「表示」→「ログ」で確認できます。

オブジェクトごとの開発[編集]

GASの開発には、Google Workspace(旧G Suite)のアカウントが必要です。Google Workspaceは、企業向けのクラウドサービスで、ビジネス用途に最適化されたアプリケーションを提供しています。

GASを開発するためには、以下の手順が必要です。

Google Workspaceのアカウントを取得する
Google Workspaceのアカウントを取得するには、以下の手順が必要です。
  1. Google Workspaceのサイトにアクセスする
  2. ログインまたは新規登録をする
  3. プランを選択する
  4. 支払い方法を登録する
スクリプトエディタを開く
スクリプトエディタは、Googleアプリケーション内に統合された開発環境で、GASのプログラムを作成するためのツールです。スプレッドシートやフォーム、GmailなどのGoogleアプリケーション内に統合されており、アプリケーション内から直接開くことができます。
スプレッドシートの場合
スプレッドシートを開いた状態で、[ツール] > [スクリプトエディタ]を選択します。
フォームの場合
フォームを開いた状態で、[設定] > [スクリプトエディタ]を選択します。
Gmailの場合
Gmailを開いた状態で、[設定] > [スクリプトエディタ]を選択します。
スクリプトを作成する
スクリプトエディタを開いたら、プログラムを作成します。GASでは、JavaScriptに似た文法を使用しています。
スクリプトを実行する
スクリプトを実行するには、以下の手順が必要です。
  1. スクリプトエディタ上で、[関数の実行]ボタンをクリックします。
  2. 実行する関数を選択します。
  3. [実行]ボタンをクリックします。

トリガー[編集]

トリガーとは[編集]

トリガー(Trigger) は、Google Apps Script(GAS)において、特定のイベントが発生したときや定期的な時間単位でスクリプトを実行する仕組みです。トリガーを使用することで、特定の条件が満たされた際に自動的にスクリプトが起動し、タスクの自動化や定期的な処理を容易に実現できます。

トリガーの基本的な概念[編集]

  1. イベントトリガー
    イベントトリガーは、特定のイベントが発生したときにスクリプトを実行するトリガータイプです。例えば、スプレッドシートが編集された、フォームの回答が送信された、などが該当します。これにより、データの変更に応じてスクリプトが即座に反応することができます。
    // 編集時トリガーの設定例
    ScriptApp.newTrigger('onEditFunction')
      .forSpreadsheet('YOUR_SPREADSHEET_ID')
      .onEdit()
      .create();
    
  2. 時間ベーストリガー
    時間ベーストリガーは、一定の時間ごとにスクリプトを実行するトリガータイプです。日次、週次、または特定の時間に実行されるように設定できます。これにより、定期的なデータ更新やバッチ処理を行うことができます。
    // 日次トリガーの設定例
    ScriptApp.newTrigger('dailyFunction')
      .timeBased()
      .atHour(2)
      .everyDays(1)
      .create();
    

メソッドチェイン[編集]

メソッドチェイン(Method Chaining) は、オブジェクトのメソッドを1つのステートメントで連続して呼び出す手法です。これにより、コードが簡潔かつ可読性が向上し、複数のメソッドがシームレスに連携して処理されます。各メソッドはオブジェクトの状態を変更し、または新しいオブジェクトを返します。この特性は、特にライブラリやフレームワークのAPIデザインでよく見られ、チェーン内で複雑な処理を効果的に表現します。

トリガーとメソッドチェインの組み合わせ[編集]

GASのトリガー設定においてもメソッドチェインを使用することができます。以下に、トリガーの作成とその際のメソッドチェインの例を示します。

// イベントトリガーの設定とメソッドチェインの例
ScriptApp.newTrigger('onEditFunction')
  .forSpreadsheet('YOUR_SPREADSHEET_ID')  // スプレッドシートの指定
  .onEdit()  // 編集時トリガーの指定
  .create();  // トリガーの作成

上記の例では、newTrigger メソッドを呼び出し、その後に続けてメソッドを呼び出しています。各メソッドはオブジェクトの状態を変更し、最終的に create メソッドがトリガーを作成します。これにより、1つのステートメントでトリガーを効率的に設定することができます。

メリット[編集]

コードの簡潔さ
メソッドチェインを使用することで、トリガーの設定が1行で完結し、コードが簡潔になります。これにより、可読性が向上し、修正やメンテナンスが容易になります。
フルエクスプレッション
メソッドチェインを使用することで、トリガーの設定が一貫しています。各メソッドはオブジェクトの状態を変更し、最終的な結果が create メソッドによって取得されるため、フルエクスプレッション(完全な表現)が実現されます。
複雑な設定の補完
メソッドチェインを使用することで、複雑なトリガーの設定を逐次的かつ自然な形で行うことができます。各メソッドが特定の設定を担当し、それらを組み合わせることで柔軟かつ効率的なトリガーが構築できます。

実践例[編集]

以下は、日次で特定の関数を実行する時間ベーストリガーを作成する例です。

// 時間ベーストリガーの設定とメソッドチェインの例
ScriptApp.newTrigger('dailyFunction')
  .timeBased()  // 時間ベーストリガーの指定
  .atHour(2)  // 毎日2時に実行
  .everyDays(1)  // 1日ごとに実行
  .create();  // トリガーの作成

これにより、毎日2時に dailyFunction 関数が自動的に実行されるトリガーが設定されます。メソッドチェインを使用することで、これらの設定が簡潔かつ直感的になっています。

トリガーとメソッドチェインを組み合わせることで、Google Apps Scriptにおいてスクリプトの実行タイミングを柔軟かつ効果的に管理することができます。

トリガーの種類[編集]

GASでは主に以下のトリガーが利用できます。

  1. onEdit トリガー
    説明
    スプレッドシートやドキュメントが編集された際に発火します。
    使用例
    スプレッドシート内のデータが変更されたら特定の処理を実行。
  2. onChange トリガー
    説明
    スプレッドシート、ドキュメント、またはフォームの内容が変更されたときに発火します。
    使用例
    フォームの回答が送信されたら処理をトリガー。
  3. onFormSubmit トリガー
    説明
    Google フォームの回答が送信されたときに発火します。
    使用例
    フォームの回答が送信されたら特定の処理を実行。
  4. timeBased トリガー
    説明
    指定した時間単位でスクリプトを実行します。
    使用例
    日次でデータを集計するスクリプトを実行。

トリガーの設定方法[編集]

トリガーはスクリプトエディタで設定することができます。

  1. スクリプトエディタを開く: Google Apps Scriptを開きます。
  2. 編集 -> 現在のプロジェクトのトリガー: メニューから「現在のプロジェクトのトリガー」を選択します。
  3. トリガーの追加: 画面右下の「トリガーの追加」ボタンをクリックします。
  4. トリガーの設定: トリガーの種類(イベントまたは時間ベース)や実行する関数を指定してトリガーを作成します。
// イベントトリガーの設定例
ScriptApp.newTrigger('onEditFunction')
  .forSpreadsheet('YOUR_SPREADSHEET_ID')
  .onEdit()
  .create();

// 時間ベーストリガーの設定例
ScriptApp.newTrigger('dailyFunction')
  .timeBased()
  .atHour(2)
  .everyDays(1)
  .create();

トリガーを設定する際は、慎重に実行頻度や対象範囲を検討し、トリガーの適切な管理を行うことが重要です。また、定期的なトリガーを設定する場合は、タイムゾーンの考慮も必要です。 これらの手順に従ってトリガーを設定することで、Google Apps Scriptをより効果的に利用し、タスクの自動化や定期的な処理をスムーズに実現することができます。

イベントとの差異と類似点[編集]

トリガーとウェブブラウザ上のJavaScriptのイベントは、いくつかの点で異なる特性を持ちつつも、同じくらい重要であり、連携する場面もあります。以下は、トリガーとイベントの差異と類似点の一般的な観点です。

差異
  1. 発生の原因:
    • トリガー: 通常、時間の経過や特定の条件が満たされたときなど、スクリプトが定期的に実行されるようスケジュールされます。
    • イベント: ユーザーのアクション(クリック、キー入力、フォームの提出など)や、ページの読み込み完了など、特定の操作や状態の変化に反応して発生します。
  2. 実行環境:
    • トリガー: Google Apps Scriptなどのサーバーサイドで実行され、スクリプトが自動的にトリガーされます。
    • イベント: ウェブブラウザー上のクライアントサイドでJavaScriptが実行され、ユーザーの操作に対して即座に応答します。
  3. 登録方法:
    • トリガー: Google Apps ScriptエディタまたはAPIを使用してスクリプト内で手動で設定されます。
    • イベント: JavaScriptのaddEventListenerメソッドを使用して、HTML要素に対してリスナーを登録します。
類似点
  1. 非同期実行:
    • トリガーもイベントも、非同期的にスクリプトを実行します。トリガーはスケジュールに従って非同期に発生し、イベントはユーザーのアクションに応じて非同期に発生します。
  2. 自動化:
    • トリガーもイベントも、何かしらの自動化やタスクのトリガーとして使用されます。トリガーは定期的な処理やバッチ処理に、イベントはユーザーとの対話や動的なページの変化に対する応答に使用されます。
  3. アクションのトリガー:
    • トリガーもイベントも、ある種のアクションをトリガーとして使用します。トリガーは特定の条件が満たされたときに実行され、イベントは特定のユーザーのアクションに応答して実行されます。

状況や使用ケースによって、トリガーとイベントが連携して利用されることもあります。例えば、特定のイベント(ボタンクリックなど)が発生した際に、それに応じてトリガーがセットされるようなシナリオが考えられます。

ベストプラクティス[編集]

トリガーを効果的に活用するためのベストプラクティスを以下に示します。

  1. トリガーの設定前にスクリプトをテスト
    トリガーを設定する前に、スクリプトが期待通りに動作するかを十分にテストします。予期せぬトリガーにより、意図しない処理が実行されることを避けるためです。
  2. 冗長性を考慮したトリガーの設計
    スクリプトの実行に時間がかかる場合や、同じ処理が重複して走ることを避けるために、冗長性を考慮してトリガーを設計します。例えば、前回の実行が完了してから一定時間経過していない場合は、新たなトリガーを設定しないようにします。
  3. エラーハンドリングを実装
    トリガーで定期的に実行されるスクリプトでは、外部のデータやサービスとの連携が含まれることがあります。エラーハンドリングを十分に実装して、エラーが発生した場合に適切に通知するなどの対策を行います。
  4. セキュリティの確保
    トリガーを設定する際には、スクリプトが必要な権限以外の情報にアクセスできないように、セキュリティを確保します。最小権限の原則を遵守し、権限の不要な拡大を避けます。
  5. トリガーの一時停止と再開
    トリガーは一時的に停止したり再開したりすることができます。スクリプトの修正やトラブルシューティング時に、トリガーを適切に管理することが重要です。
    // トリガーの一時停止
    ScriptApp.getProjectTriggers().forEach(trigger => ScriptApp.deleteTrigger(trigger));
    
    // トリガーの再開
    ScriptApp.newTrigger('myFunction').timeBased().everyDays(1).create();
    
  6. トリガーの監視とログ
    トリガーの実行状況をモニタリングし、ログを出力しておくことで、スクリプトの動作やパフォーマンスを把握しやすくなります。
    // ログの出力
    function myFunction() {
      Logger.log('スクリプトが実行されました。');
    }
    

これらのベストプラクティスを遵守することで、トリガーを効果的に活用し、安定かつセキュアな自動化スクリプトを構築することができます。

アプリとの連携[編集]

スプレッドシートとの連携[編集]

Google Apps Script(GAS)は、Google Sheets(スプレッドシート)とのシームレスな連携を提供します。スプレッドシートとの連携にはさまざまな基本的な操作が含まれます。

セルに値を書き込む[編集]

特定のセルに値を書き込むには、SpreadsheetApp オブジェクトを使用します。以下は、A1セルに「Hello, World!」と書き込むサンプルコードです。

function writeHelloWorld() {
   SpreadsheetApp.getActiveSheet().getRange("A1").setValue('Hello, World!');
}

このコードでは、getActiveSheet() で現在アクティブなシートを取得し、getRange("A1") でA1セルを指定しています。そして、setValue('Hello, World!') でセルに値を書き込んでいます。

セルから値を読み込む[編集]

特定のセルから値を読み込むには、getValue() メソッドを使用します。以下の例では、A1セルの値を読み込んで変数 cellValue に格納しています。

function readCellValue() {
    const  cellValue = SpreadsheetApp.getActiveSheet().getRange("A1").getValue();
    Logger.log('A1セルの値: ' + cellValue);
}

Logger.log() を使用して読み込んだ値をログに表示しています。これはスクリプトエディタ内で確認できます。

セルに計算結果を書き込む[編集]

スプレッドシート上の数値を取得し、それらを計算して結果を別のセルに書き込むことも可能です。以下のサンプルでは、A1セルとA2セルの値を足してA3セルに結果を書き込んでいます。

function calculateAndWrite() {
    const a1 = SpreadsheetApp.getActiveSheet().getRange("A1").getValue();
    const a2 = SpreadsheetApp.getActiveSheet().getRange("A2").getValue();
    const  result = a1 + a2;
    
    SpreadsheetApp.getActiveSheet().getRange("A3").setValue(result);
}

これらの基本的な操作を組み合わせることで、スプレッドシート上でデータを操作し、GASで処理を行うことができます。これは非常に強力で、自動化されたタスクやカスタム機能の実装に役立ちます。

演習

まず、以下のような演習用にワークシートを用意します。

  A     B     C  
 1  5 14
 2  3 20
 3 
 4 
A1とA2の和を求めてA3に書き込みましょう。

スプレッドシートのセルに、数式や関数を書くのが一般的ですが、 本プログラムはスクリプト練習用なので、スクリプトで実行してみましょう。

function sumAndSet() {
    const sheet = SpreadsheetApp.getActiveSheet();
    
    // A1とA2セルの値を取得
    const a1 = sheet.getRange("A1").getValue();
    const a2 = sheet.getRange("A2").getValue();
    
    // 数値が正しく取得できたか確認
    if (typeof a1 !== 'number') {
        Logger.logger('A1のセルに数値がありません。');
        return;
    }

    // 数値が正しく取得できたか確認
    if (typeof a2 !== 'number') {
        Logger.logger('A2のセルに数値がありません。');
        return;
    }

    // A1とA2の値の合計を計算
    const sum = a1 + a2;

    // 計算結果をA3セルにセット
    sheet.getRange("A3").setValue(sum);
}
  1. SpreadsheetApp.getActiveSheet(): 現在アクティブなスプレッドシートのシートを取得します。
  2. sheet.getRange("A1").getValue(): A1セルの値を取得します。
  3. 同様にA2セルの値も取得します。
  4. typeof a1 !== 'number': typeof演算子を使用して、変数が数値でない場合にエラーメッセージを表示します。
  5. Logger.log(): エラーメッセージをログに出力します。LoggerはGoogle Apps Scriptのログ出力を行うためのクラスです。
  6. sheet.getRange("A3").setValue(sum): A3セルに合計値をセットします。

上記コードの実行に成功すれば、下記のように A3 に計算結果 8 が書き込みされます。

  A     B     C  
 1  5 14
 2  3 20
 3  8
 4 
セルに式を書く

Google Apps Script(GAS)を使用してセルに式(数式)を書き込むことができます。以下は、そのためのサンプルコードです。

function writeFormulaToSheet() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // B1セルにSUM関数を含む数式を書き込む
  sheet.getRange("B1").setFormula("=SUM(A1:A5)");
}

このコードでは、setFormula メソッドを使用してB1セルにSUM関数を含む数式を書き込んでいます。この例では、A1からA5までのセルの合計を計算するSUM関数を使用していますが、任意の数式を使うことができます。

注意点として、セルに式を書き込むと、そのセルに表示されるのは計算結果であり、実際の式は編集バーに表示されます。数式自体をセルに表示させたい場合は、setFormula ではなく setValue を使用し、数式を文字列としてセルに書き込むこともできます。

function writeFormulaStringToSheet() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // B1セルにSUM関数を含む数式の文字列を書き込む
  sheet.getRange("B1").setValue("=SUM(A1:A5)");
}

これにより、B1セルには =SUM(A1:A5) という数式文字列が直接表示されます。どちらの方法も、特定のセルに式を書き込むための手段として活用できます。

Google Apps Scriptで求めた合計とSUM関数の結果が違う理由

Google SheetsのSUM関数は、内部で高度な数値処理を行うため、一般的なJavaScriptやGoogle Apps Scriptでの合計計算とは異なる精度を保証しています。SUM関数は、浮動小数点数における丸め誤差を最小限に抑えるために、特別なアルゴリズム(例えば、カハンの加算アルゴリズム)が適用されています。

Google SheetsのSUM関数がブラウザ上で動作するとき、データの精度が高いものが必要であり、そのためにカハンのアルゴリズムなどが利用されています。一方で、Google Apps ScriptやJavaScriptは、通常の浮動小数点数の計算を行いますが、これは厳密な精度を保証するものではありません。

そのため、Google Apps Scriptでの合計計算とGoogle SheetsのSUM関数の結果が異なる場合があることは、浮動小数点数演算における丸め誤差や計算の仕組みの違いによるものです。必要に応じて、GAS側でもカハンのアルゴリズムなどを利用して、より正確な計算を行うことが考えられます。

function writeFormulaToSheet() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // B1セルにSUM関数を含む数式を書き込む
  sheet.getRange("B1").setFormula("=SUM(A1:A5)");

  // 数値を含む範囲の値を取得
  const values = sheet.getRange("A1:A5").getValues();

  // 二次元配列から一次元配列に変換
  const ary = values.flat();

  // 合計を求める
  const sum = ary.reduce((a, b) => a + b, 0);

  // C1セルに合計を書き込む
  sheet.getRange("C1").setValue(sum);

  // カハンの加算アルゴリズムで合計を求める
  let ksum = 0.0;
  let compensation = 0.0;

  for (const n of ary) {
    const y = n - compensation;
    const t = sum + y;
    compensation = (t - ksum) - y;
    ksum = t;
  }
  // D1セルに結果を書き込む
  sheet.getRange("D1").setValue(ksum);

セルの型とGoogle Apps Scriptの型[編集]

Google Apps Script(GAS)では、Google Sheets内のセルの値の型と、GASで扱われるデータ型はいくつかあります。以下にそれぞれの対応を示します。

Google Sheets内のセルの型
  1. 文字列型(String):
    • 通常のテキストや数字の前に単一引用符(')がない場合には文字列として扱われます。例: Hello, World!
  2. 数値型(Number):
    • 数字だけが入力されている場合、または数式の結果が数値の場合には数値型として扱われます。例: 123, 3.14
  3. 日付型(Date):
    • 日付や時刻の形式が入力された場合には日付型として扱われます。例: 2022/01/23, 12:30 PM
  4. 論理型(Boolean):
    • TRUEまたはFALSEと入力された場合には論理型として扱われます。
  5. エラー型(Error):
    • セル内でエラーが発生した場合にはエラー型として扱われます。
Google Apps Scriptでのデータ型
  1. 文字列型(String):
    • JavaScriptの文字列型と同様に、テキストを表現します。
  2. 数値型(Number):
    • JavaScriptの数値型と同様に、整数や浮動小数点数を表現します。
  3. 日付型(Date):
    • JavaScriptのDateオブジェクトを使用して日付や時刻を表現します。
  4. 論理型(Boolean):
    • JavaScriptの論理型と同様に、trueまたはfalseを表現します。
  5. 配列型(Array):
    • JavaScriptの配列型と同様に、複数の値を格納できるデータ型です。

GASでは、Google Sheetsから取得したセルの値は基本的には文字列として扱われることがあります。そのため、数値や日付などの型が必要な場合は、適切な変換を行う必要があります。たとえば、getValues()を使用してセルの値を取得すると、二次元配列で取得され、必要に応じて適切な型への変換が必要です。

以下は、Google Sheetsからセルの値を取得し、適切な型に変換する例です。この例では、数値、日付、論理値が含まれているシートを想定しています。

function processSheetData() {
  // 現在アクティブなシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // セル範囲の値を取得(二次元配列)
  const cellValues = sheet.getDataRange().getValues();

  // データの処理
  for (const row of cellValues) {  // 行を取得
    for (const cellValue of row) { // セルの値を取得

      // セルの型に応じて処理を行う
      if (typeof cellValue === 'number') {
        // 数値型の場合
        Logger.log('数値型: ' + cellValue);
      } else if (typeof cellValue === 'object' && cellValue instanceof Date) {
        // 日付型の場合
        Logger.log('日付型: ' + cellValue.toISOString());
      } else if (typeof cellValue === 'boolean') {
        // 論理型の場合
        Logger.log('論理型: ' + cellValue);
      } else {
        // 文字列型やその他の型の場合
        Logger.log('文字列型またはその他の型: ' + cellValue);
      }
    }
  }
}

この例では、getValues()メソッドでセルの値を取得し、その後、二重のループを使用して各セルの値の型を判定しています。数値型、日付型、論理型、文字列型などに応じて適切な処理が行われます。ログに結果が表示されますが、実際のシナリオに応じてこれを他の処理に置き換えることができます。

ユースケース[編集]

TスプレッドシートとGoogle Apps Scriptの連携は、多岐にわたり様々なユースケースに適用されます。以下にいくつかの代表的なユースケースを挙げてみましょう。

データの自動更新と計算
スプレッドシート内のデータを定期的に取得し、自動的に計算や処理を行う。たとえば、株価や天気情報の自動更新、為替レートの計算など。
レポートの自動生成
スプレッドシートに格納されたデータをもとに、定期的にレポートを生成する。例えば、営業成績の集計やプロジェクト進捗の可視化など。
フォームの連携
Google Apps Scriptを使用してGoogleフォームと連携し、フォームからの回答をスプレッドシートに自動的に記録する。集めたデータを簡単に分析することができます。
カスタムなデータ処理
スプレッドシートに格納されたデータを取得し、独自の処理を行う。たとえば、特定の条件に基づいてデータをフィルタリングしたり、変換したりする場合。
カレンダーの連携
Google Apps Scriptを使用してGoogle Calendarと連携し、予定やイベントの情報をスプレッドシートに自動的に取り込む。逆に、スプレッドシートのデータを元にカレンダーに予定を追加することも可能。
メールの送受信
Google Apps Scriptを使用してGmailと連携し、特定の条件が満たされた際に自動的にメールを送信する。受信したメールを解析してスプレッドシートにデータを格納することもできます。
ユーザーインタフェースのカスタマイズ
Google Apps Scriptを使用して、スプレッドシートのユーザーインタフェースをカスタマイズする。簡易なダッシュボードやメニューを作成し、ユーザビリティを向上させることができます。

これらのユースケースはあくまで例であり、Google Apps Scriptを利用することで、様々な業務プロセスの自動化や効率化が可能です。ユーザーのニーズや業務の特性に合わせて柔軟に適用できるのがGoogle Apps Scriptの魅力です。

ベストプラクティス[編集]

スプレッドシートとの連携において、効果的かつ効率的なプログラミングを実現するためのベストプラクティスがあります。以下は、それらのベストプラクティスのいくつかです。

トリガーの活用
Google Apps Scriptのトリガーを利用して定期的な実行や特定のイベント発生時にスクリプトを実行することができます。例えば、onEditトリガーはセルが編集された際に実行されます。
データの一括処理
スプレッドシートからのデータの取得や書き込みは、一度にまとめて処理する方が効率的です。getValuessetValuesメソッドを使用して複数のセルを一括で処理しましょう。
エラーハンドリング
ユーザーが期待するデータが存在しない場合やAPI呼び出しでエラーが発生した場合に備え、エラーハンドリングを実装しましょう。ログ出力やエラーメールの送信などを考慮します。
認証の最小限化
スクリプトが必要な権限以外の情報にアクセスできないよう、原則として最小権限の原則を遵守します。必要な範囲のデータだけを取得し、余分なアクセスを避けましょう。
スクリプトの構造化
スクリプトが複雑になる場合、関数やモジュールに分割してコードを構造化しやすくします。可読性が向上し、メンテナンスが容易になります。
リソースの最適化
大量のデータを処理する際には、処理対象を制限したり、非同期処理を検討することでスクリプトのパフォーマンスを向上させます。
キャッシュの活用
繰り返し同じデータを取得する場合、CacheServiceを使用して結果をキャッシュすることで、API呼び出し回数を削減しパフォーマンスを向上させます。
ユーザーインタフェースの最適化
スクリプトを実行するためのユーザーインタフェースを追加する場合、直感的で使いやすいUIを提供し、ユーザビリティを向上させます。
テストとデバッグ
コードを変更する前にスクリプトをテストし、デバッグを行います。Loggerやデバッグメッセージを活用してスクリプトの動作を確認しましょう。

これらのベストプラクティスを遵守することで、スプレッドシートとの連携においてより効果的で信頼性の高いスクリプトを開発することができます。

用語集[編集]

SpreadsheetApp
Google Apps Scriptでスプレッドシートを操作するための主要なオブジェクト。シートの取得、セルの操作、値の設定などのメソッドやプロパティを提供する。
getActiveSheet()
SpreadsheetApp オブジェクトのメソッド。現在アクティブなシートを取得するために使用される。
getSheetByName(name)
SpreadsheetApp オブジェクトのメソッド。指定した名前のシートを取得するために使用される。例: SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1')
getRange(range)
SpreadsheetApp オブジェクトやシートオブジェクトのメソッド。指定した範囲のセルを取得するために使用される。例: getActiveSheet().getRange("A1")
getValue()
セルから値を取得するメソッド。getRange() で取得したセルオブジェクトに対して使用される。例: getRange("A1").getValue()
setValue(value)
セルに値を設定するメソッド。getRange() で取得したセルオブジェクトに対して使用される。例: getRange("A1").setValue('Hello, World!')
Logger
Google Apps Scriptの組み込みオブジェクト。デバッグやログ出力に使用され、スクリプトエディタ内でログを確認できる。
onEdit(e)
Google Apps Scriptのトリガー関数。スプレッドシート上でセルが編集されると呼び出される。例えば、特定のセルの変更に応じてスクリプトが実行される。
onChange(e)
Google Apps Scriptのトリガー関数。スプレッドシート上で変更があると呼び出される。セルの追加や削除などが含まれる。
getActiveSpreadsheet()
SpreadsheetApp オブジェクトのメソッド。現在アクティブなスプレッドシートを取得するために使用される。
UrlFetchApp
Google Apps Scriptで外部のURLやAPIと連携するためのオブジェクト。外部サーバーとのデータの取得や送信に使用される。

スライドとの連携[編集]

フォームとの連携[編集]

実践的なプログラム作成[編集]

スプレッドシートの自動操作[編集]

フォームの自動回答[編集]

Gmailの自動送信[編集]

Googleカレンダーの自動予定追加[編集]

応用編[編集]

APIの利用[編集]

Webアプリケーションの作成[編集]

GASのライブラリの利用[編集]

トラブルシューティング[編集]

エラーメッセージの意味[編集]

デバッグ方法[編集]

まとめと今後の展望[編集]

GASの特長の再確認[編集]

Google Apps Script(GAS)は、Googleが提供するスクリプト言語で、Google Workspace製品とのシームレスな統合が特長です。主な特徴には以下が挙げられます。

Googleサービスとの統合性
GASは、Google Sheets、Gmail、Google DriveなどのGoogleサービスとの密接な統合が可能です。これにより、業務プロセスを効率化し、自動化するためのパワフルなツールとなります。
JavaScriptベース
GASはJavaScript言語を基盤としており、開発者が簡単に学習し始められるのが特長です。JavaScriptに慣れている開発者は、GASを使用してGoogle Workspaceの機能を拡張できます。
簡易な開発環境
GASのスクリプトエディタはブラウザベースで利用可能であり、迅速なプロトタイピングやスクリプトの作成が容易です。特別な開発環境のセットアップは必要ありません。

GASを使った業務効率化の可能性[編集]

GASを活用することで、業務プロセスの自動化や効率化が可能です。

スプレッドシートの自動更新
GASを使用して、スプレッドシート内のデータを定期的に更新したり、外部データと同期させたりすることができます。
メールの自動送信と受信処理
GmailAppを使用して、特定の条件に基づいてメールを自動的に送信したり、受信したメールを処理したりするスクリプトを作成できます。
Google Driveのファイル管理
DriveAppオブジェクトを使用して、Google Drive上のファイルを操作するスクリプトを作成できます。例えば、ファイルのコピー、移動、削除などが可能です。

今後のGASの進化と展望[編集]

GASは頻繁にアップデートされ、新しい機能が追加されています。今後の展望としては以下が考えられます。

APIの拡充
Google Workspaceの新しいAPIやサービスへのアクセスが向上し、より多くの機能がGASで利用可能になるでしょう。
開発者ツールの向上
スクリプトエディタやデバッグツールの機能が向上し、開発者がより効果的にスクリプトを作成・管理できるようになるでしょう。
セキュリティ機能の向上
セキュリティ上の懸念に対応し、より安全にGASを利用できるようになることが期待されます。

GASはビジネスプロセスをスムーズにし、効率を向上させるための貴重なツールであり、今後の進化がますます期待されています。

リソース[編集]

Google Apps Script(GAS)に関連する学習や開発のためのリソースは多岐にわたります。以下は、GASに関する有益なリソースの一部です。

Google Apps Script 公式ドキュメント
Google Apps Scriptの公式ドキュメントは、基本的な概念から高度なトピックまで包括的な情報を提供しています。スクリプトの基本的な作成方法やトリガーの設定、APIの使用方法などが詳しく説明されています。
Google Apps Script GitHub リポジトリ
Google Apps Scriptのサンプルコードやプロジェクトの進行状況に関する情報は、GitHubリポジトリで入手できます。ここでは、コミュニティによって提供された便利なスクリプトやプロジェクトの実装例を見つけることができます。
Google Workspace Developers Blog
Google Workspace Developers Blogでは、最新のGoogle Apps Scriptのアップデートや新機能に関する公式なアナウンスがあります。開発者はここで最新情報を追跡し、新しい機能を理解できます。
Google Apps Script Issue Tracker
Google Apps Scriptのバグや提案などの問題を報告するためのIssue Trackerです。また、他の開発者が報告した問題を調査することもできます。

これらのリソースを利用することで、Google Apps Scriptを使った開発において有益な情報やサポートを見つけることができます。