GoogleAppscript(GAS)とは、Googleが開発・提供しているプログラミング言語です。JavaScriptというWebブラウザ上で動作するプログラミング言語をベースに作成されています。
「GASを覚えたいけど、どこから始めたら良いのかわからない」
「ExcelのマクロをGASで作り変えたいけど、実際に動かせるのだろうか?」
「スプレッドシートで作った管理表をWebに公開してスタッフが見れるようにしたい」
このようにGASに興味はあっても、実際に何から始めたら良いのか不安で、一歩を踏み出せない方もいるのではないでしょうか。自分で調べようにも、何を調べれば良いのか?がわからない。何がわからないか?がわからない自分がそこにあるのです。ポイントさえ掴めば、現在はネットで調べることができます。(今、話題のChatGPTでも調べられます)。
本記事では、GASを利用するに当たって理解しておくべきポイントや基本的なスプレッドシートの扱い方、スクリプト(プログラム)作成方法をでできるだけ、詳細に紹介しています。GASをどうやって勉強すれば良いかもわかりますので、GASが初めての方でもスムーズに取り掛かることができます。GASに興味がある方や業務の効率化を考えている方にも、有益な内容となっています。ぜひこの記事を読んで、GASの利用を検討してみてください。
- Gmailアカウントさえあれば誰でも無料で使えます。
GASは、Gmailアカウントさえあれば誰でも無料で始められるのが特徴です。 - Googleの関連サービスと連携できる
GmailやGoogleスプレッドシートなど、Googleが提供する各種サービスツールとの連携が容易で、各種サービスの効率化や作業の自動化をGASで開発して取り入れることができます。Googleドライブ、Googleドキュメント、スプレッドシート、Googleカレンダー、Googleマップ、Gメール等 - 開発環境はWebブラウザで動作するためセットアップが不要
GASの開発環境はGoogleのWebブラウザベースで動作し、開発環境のインストール等のセットアップが必要ありません。スクリプトの実行もGoogleのサーバー上で行われるため、自身のパソコンを起動する必要もありません。 - JavaScriptをベースに作られている
GAS専用の関数はあるものの、言語の基本はWebアプリケーションにもよく用いられる言語であるJavaScriptをベースに作られている為、覚えておいて損はありません。
スクリプトエディターの使い方
スクリプトの種類
GASには、スプレッドシートやフォームに紐付くコンテナバインド型「Container Bound Script」と、独立したスタンドアロン型「Standalone Script」(ドライブ上に単独で存在するもの)との2種類の開発方式があります。コンテナバインド型は、GoogleスプレッドシートやGoogleドキュメント、外部サービスなどと連携して動作するスクリプトのことです。GASはExcelやWordで使えるVBAと同じように、スプレッドシートなどのドキュメントと紐付けることが可能です。スタンドアロン型は、単体で動作するスクリプトのことで、GoogleスプレッドシートやGoogleフォームなど、Google関連サービスと連携する必要がない場合に使用します。
コンテナバインド型
スプレッドシートから「スクリプトエディタ」を選択すると、自動的にContainer BoundScriptプロジェクトが作成されます。
コンテナバインド型のGASエディターの開き方
コンテナバインド型のGASでスクリプトエディタを開く場合は紐づくサービスのメニューからスクリプトエディタを開きます。各アプリ(GoogleAppsScript)の拡張機能からAppsScriptをクリックすると、エディターを開くことができます。
[ その他のサービス ]
コンテナバインド型のメリット
- コンテナバインドでのみ利用可能なコードがあります。
(アラートを表示したり、HTMLを表示するコードetc) - Googleスプレッドシートから利用ができるため、手軽に始められます。
- IDなどを指定しなくても参照が可能なクラスが準備されています。
- スクリプトの実行が簡単
「Googleスプレッドシート」などは図形などにスクリプトを割り当てることによりスクリプトの実行が簡単にできます。
コンテナバインド型のデメリット
- 扱っているGASのスクリプトの数が増えると管理が大変。
- Googleドライブ上で確認できない。
Googleドライブ上にスクリプトファイルは表示されないため、スクリプトが設定されているかどうか分からない。
注意:GASのホーム(https://script.google.com/home)で確認できます。
スタンドアロン型
スタンドアロン型のGASエディタの開き方
GASのスタンドアロンスクリプトは、Googleドライブから新規ファイルとして開くことができます。
スタンドアロン型のメリット
- スタンドアロン型のGASファイルはGoogleドライブに表示されます。
Googleドライブで表示される為、管理しやすい - スクリプトを隠すことができます。
スプレッドシートなどに紐付かないため、スプレッドシート利用者に対し、スクリプトを秘匿することが可能です。
スタンドアロン型のデメリット
- コンテナバインドでできるコードがスタンドアロンではできないこと。
- スプレッドシートから実行できない。
紐付けされていないため「Googleスプレッドシート」などからスクリプトの実行ができません。 - 「Googleスプレッドシート」などを操作する場合はIDが必要となります。
機能的な面で言えば、コンテナバインド型の方がすべての機能がありますが、管理のしやすさからはスタンドアロン型となります。Google Apps Scriptの利用ケースを考慮し、コンテナバインド型でしかできない場合はコンテナバインド型を選択、そうでなければ、スタンドアロン型を選択するのがオススメです。(初めての場合は、VBAと同じコンテナバインド型の方が入りやすいでしょう。)
エディターの画面構成
スクリプトエディターとは、コードを記述したり、管理する場所のことです。エディターは、プロジェクトとファイルで構成されます。GASではスクリプト(プログラム)を「プロジェクト」という単位で作成していきます。プロジェクトの中にはいくつかの「ファイル」を作ることができます。
プロジェクト名の変更
プロジェクト名をクリックすると以下のような画面が表示されますので、プロジェクトタイトルを入力して「名前を変更」をクリックします。
ファイル名の変更
「︙」をクリックして、「名前を変更」をクリックします。
関数名(myFunction)の変更
同一プロジェクト内では関数名はユニークとします。例えばコード1.gs、コード2.gs等と別ファイルとしていても同じ関数名(例えばmyFunction)であれば、すべてのmyFunctionが実行されます。
例:
関数名は同じ「myFunction」となっていますので、シートの追加.gsのmyFunctionも、シート名の設定.gsのmyFunctionも実行されてしまいます。
エディターの使い方
ここでは、コンテナバインド型スクリプトで解説をします。
Google Driveから新規のスプレッドシートを開く
「+新規」ボタンをクリック
「空白のスプレッドシート」をクリック
「Googleスプレッドシートから「空白のスプレッドシート」をクリックします。
GoogleスプレッドシートからGASを開く
スプレッドシートを開いて「拡張機能」タブから「AppsScript」をクリックします。
スクリプトの作成・保存
コードを記述する
スクリプトエディターが開きますので、ここにスクリプトを書いていきます。()と{の間は、ここでは半角空白を入れていますが、なくても構いません、見易さの問題です。最後の}は忘れずに、先に書いておきましょう。
- ステートメントの最後にはセミコロン(;)を記述する
- 命令は大文字・小文字が厳密に区別されています
画面上部にある「無題のプロジェクト」というのは、プロジェクトのタイトルです。こちらは自由に書き換えて構いません。 この場合は、例えば「スプレッドシート作成」などと設定しましょう。「myFunction」は、関数名です。実行する内容に合わせて書き換えるとプロジェクトが大きくなったときにわかりやすいでしょう。
ここでは、Logger.log(“Hello! GAS!”);と書きます。Logger.log()はGASでログ(履歴のようなもの)を表示するために使用する関数です。
書いたコードを保存する。
「保存」ボタンをクリックするか又は、[Ctrl + S]で保存出来ます。「コード.gs」に付いているオレンジの印が消えたら「保存完了」。○コード.gsとして○がついている時は、保存されていないことを意味します。
保存すると○は消えます。スプレッドシートやドキュメントと異なり、GASのスクリプトは自動保存ではありません。
コードを実行する
「実行」ボタンをクリックをクリックするか又は、[Ctrl+R]で実行できます。
上のようなログが表示されたら成功です。
留意:GASのスクリプトは関数単位で実行します。
ファイルに複数の関数を入力している時には、目的の関数を選択しておく必要がありますので、ご注意下さい。プルダウンで実行したい関数を選択します。
コメントアウトの方法
コメントアウトのやり方は2パターンあります。
先頭に//を付ける(各行)
コメントアウトしたい行のどこでもよいのでカーソルを位置づけて、CTRL+/を押します。
※再度CRTL+/で解除されます。
「/*と/」で囲む(複数行)
ショートカットはないので、手入力します。
スプレッドシートの構成
スプレッドシートの構成
スプレッドシートは、4つクラスで構成されています。GASにおいて、スプレッドシートを操作するためのクラスを提供するのがSpreadsheetサービスです。
SpreadsheetAppクラスから、Spreadsheetクラス→Sheetクラス→Rangeクラスと配下になるに従って枠が限定されている階層構造となっています。クラスは、「便利な関数(function)をグループ分けする箱」で、クラスに所属する関数をメソッドと捉えます
- [ SpreadsheetAppクラス ]
Spreadsheetサービスの最上位に位置するクラスがSpreadsheetAppクラスです。スプレッドシートというアプリケーションとなり、スプレッドシートファイルのデータを管理するクラスです。 - [ Spreadsheetクラス ]
Excelで言えば「ブック」でありスプレッドシートのデータ(シート、スプレッドシートの名前、アクセス権限等)を管理するクラスです。例えば、スプレッドシートのファイル名の変更、シートの作成、取得、削除等ができます。 - [ Sheetクラス ]
Excelでもシートとなり、シートのデータ(シート名、セル等)を管理するクラスです。例えば、シート名の変更、行の追加・削除、選択した範囲のセルの取得などができます。 - [ Rangeクラス ]
選択した範囲のセルのデータを管理するクラスです。例えば、セルの値を取得・変更することができます。
スクリプトの構成
プログラムは、基本的には3つの要素から成り立っています。簡単に説明すると、操作対象を表す「オブジェクト」、”動き”を表す「メソッド」、”状態”を表す「プロパティ」の3要素から成り立っています。オブジェクトはプロパティで管理(オブジェクトの内容や詳細、属性)されていて、プロパティの値に数値や文字列が入っているものがプロパティ、プロパティの値に関数が入っているものがメソッドとなります。
オブジェクト
プログラムでは、「何かをどうする」と言った形で命令を書きます。この「何を」がオブジェクトになります。GASではスプレッドシートをはじめ各サービスの操作対象とするモノを「オブジェクト」と言い、次のようなオブジェクトが用意されています。
- アプリケーション:SpreadsheetAppオブジェクト
- スプレッドシート:Spreadsheetオブジェクト
- シート:Sheetオブジェクト
- セル範囲:Rangeオブジェクト
そしてオブジェクトはスプレッドシートのアプリケーション→スプレッドシート(ブック)→シート→セルという階層構造になっています。また、これらを操作するために、メソッドとよばれるたくさんの命令が用意されています。
[ 処理内容 ]
例えば、スプレッドシート「社員名簿」のシート「ハッピイ1号館」のD3セルの値を取得するという処理は、次のようになります。
- スプレッドシート「社員名簿」を、Spreadsheetオブジェクトとして取得する
- そのSpreadsheetオブジェクトの配下にあるシート「ハッピイ1号館」を、Sheetオブジェクトとして取得する
- そのSheetオブジェクトの配下にあるD3セルを、Rangeオブジェクトとして取得する
- そのRangeオブジェクトの値を取得する
メソッド
メソッドはオブジェクトに対する命令です。getActiveScriptSheet、getSheetByName、getActiveSheet、getRange、setValue等はメソッドとなります。VBAではプロパティになります。
- getActiveScriptSheetを実行して、アクティブなスプレッドシートを受け取り、
- getSheetByNameを実行して、シート(社員名簿)を受け取り、
- .getRangeを実行して、セル(D3)を受け取り、
- .getValueを実行して、セルの値(54)を取得します。
スクリプトを書く
それでは、実際にスクリプトを書いてみます。スプレッドシートのシート1のA1セルに「Hello! GAS!」という文字を書き込んでみます。
A1に値を入れる
スプレッドシートの作成
現在、A1セルは空白です。ここに「Hello!! GAS!」という文字を書き込みます。A1セルに「Hello! GAS!」という文字を書き込むスクリプトを入力してみます。
スクリプトの作成
「拡張機能」タブから「Apps Script」をクリックします。
A1セルを特定する為にSpreadsheetAppクラスから、Spreadsheetクラス→Sheetクラス→Rangeクラスと階層を特定する必要があります。
SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetAppは、スプレッドシート全体を意味するトップレベルのオブジェクトです。
constは、変数宣言で、varとletとは異なり再代入/再宣言のできない宣言方法です。
getActiveSpreadsheet()メソッドは、アクティブなスプレッドシートを取得します。つまりSpreadsheetApp.getActiveSpreadsheet()は、「スプレッドシート全体の中から、アクティブなスプレッドシートを取得せよ」という命令です。その結果(戻り値)を、変数「SS」に格納していますので、変数「SS」には、「アクティブなスプレッドシート(Spreadsheetオブジェクト)」が格納されているのです。
ss.getSheetByName(“シート1”);
Spreadsheetオブジェクトの配下にあるシート(“シート”)を、getSheetByNameメソッドを実行して、Sheetオブジェクトとして取得します。
sheet.getrange(“A1”);
Sheetオブジェクトの配下にあるA1セルを、getRangeメソッドを実行して、Rangeオブジェクトとして取得します。
range.setValue(“HELLO! GAS!”);
A1セルに”Hello! GAS!”という文字をセット(書き込みます)します。
スクリプトの実行
スクリプトができましたので、実行してみます。
注意:
スクリプトを初回実行するとき次のような承認画面が表示された場合は承認作業を行ってください。
手順はこちら
。
実行結果
A1セルの値をB1へ
次に、A1の値を取得して、B1に書き込む場合のスクリプトの書き方をやってみます。現在A1セルには、「こんにちは!!」という文字が書き込まれています。この文字を取得して、B1セルに書き込みます。
スクリプトの作成
まずは、どこに値をいれるのか?でgetRange(“B1”)を指定して、setValue()で値をsetします。その値は、どこの値か?でgetRange(“A1”)を指定して、getします。
実行結果
承認の方法
スプレッドシートやフォームなどのサービスと連携させる処理を行うと初回起動時のみ承認作業が必要です。アクセス許可が必要なのは、アカウント毎ではなく、1つのアプリ(スプレッドシート毎)に対して必ず1度承認しないといけません。
権限を確認
最初に実行する場合は、認証が必要となります。
「詳細」をクリック
「詳細」から「無題のプロジェクト(安全ではないページ)に移動」をクリックします。
「許可」をクリック
スプレッドシートの操作
スプレッドシートの取得
SpreadsheetAppの配下のスプレッドシートファイルを取得します。
[ スプレッドシートの取得方法 ]
スプレッドシートの取得方法は、3つあります。
- アクティブなスプレッドシートを取得する方法
- URLを使って取得する方法
- IDを使って取得する。
アクティブなスプレッドシートを取得する方法
コンテナバインドスクリプトで有効な方法です。Excelで言えば「ブック」にあたります。
URLを使って取得する方法
バインドされていないスプレッドシートを取得する方法です。
ドライブIDとURLは、ファイルやフォルダを移動しても不変です。スクリプトを作成した後にファイルの場所やフォルダ構成を変更しても、スクリプトに記述したID、URLを修正する必要はありません。
IDを使って取得する方法
バインドされていないスプレッドシートを取得する方法です。
スプレッドシートのコピー
GASでスプレッドシートをコピーします。ここでは、以下の「無題のスプレッドシート」の複製を作成します。
スクリプトの作成
実行結果
スプレッドシートが複製されました。
シートの操作
シートの取得
[ シートの取得方法 ]
スプレッドシートの取得方法は、3つあります。
- SpreadsheetAppクラスからアクティブシートを取得する方法
- Spreadsheetクラスからシート名で取得する方法
- Spreadsheetクラスから配列で取得する方法。
SpreadsheetAppクラスからアクティブなシートを取得する。
クラスが持っている機能 (メンバー)を使用する方法です。例えばSpreadsheetAppクラスのgetActiveSheet()というメンバーを使ってSpreadsheetクラスを飛び越え、Sheetを取得する方法です。
シート名を特定せず、アクティブなシートが対象となりますのでご注意下さい。この例では、シート1がアクティブとなっている為、シート1に「Hello! GAS!」が書き込まれています。
Spreadsheetクラスからシート名で取得する方法
シート名を指定するので、わかりやすいメリットはありますが、シート名を変更した際は、スクリプトも変更する必要があります。
Spreadsheetクラスから配列で取得する方法
SpreadsheetクラスのgetSheets()というメンバーを使って配列として取得する方法です。getSheets()で全シートを取得して、配列を指定してシートを特定します。
この方法のメリットは、将来シート名を変更した場合でも、動作に影響がないことです。但し、シートの順番に変更が生じると配列に格納されている順番もかわってしまいますので注意が必要です。
※一番左のシートがインデックス0となります。
シートのコピー
スプレッドシートから取得したシートに対してSheetクラスで提供されるメソッドを使うことで様々な操作を行うことができます。
copyTOメソッド
SheetクラスのcopyTOメソッドは、対象のシートをコピーします。
シートのコピーができました。
留意:
コピー対象の元シートが1つしかない場合は、シートの取得はgetActiveSheetで良いですが、アクティブなシートがづれていたりすることがありますので、複数のシートがある場合は、コピー専用の元シートを作成して、シート名を指定するgetSheetBynameで取得するのが良いでしょう。
getSheetByNameメソッド
シート名をセットする。
copyToメソッドでコピーしたコピーしたシートは、「(元シート名)のコピー」という名前となりますので、任意の名前に変更する場合は、SheetクラスのsetNameメソッドを使います。
シートをクリアする。
書式は残して値や数式をクリアするには、SheetクラスのclearContentsメソッドを使いますが、コピーしたシートはタイトルは残して中はクリアしたい場合が多いと思います。その場合は、RangeクラスのclearContent(末尾のsは不要)メソッドを使います。文字色・背景色・罫線などの書式はクリアされません。
留意:
シートのコンテンツをすべてクリアするにはSheetオブジェクトに対してclearContentsメソッドを使用しますが、このような”タイトルを残して”という特定範囲のコンテンツをクリアするにはRangeオブジェクトに対してclearContentメソッドを使用します。
セルの操作
セルを指定して取得する。
セルやセル範囲を指定して取得する方法として代表的なものは、2つあります。
- アドレスを指定して取得する方法
- 行列を指定して取得する方法
以下のシートを例に解説します。
アドレスを指定して取得する方法
SheetクラスのgetRange()というメンバーを使ってA1やA1:C1というようにセル番号(アドレス)を指定として取得する方法です。ここでは、中田朋子さんの年齢(D3)を取得します。
行列を指定して取得する方法
SheetクラスのgetRange()というメンバーを使って行列を指定して範囲を取得する方法です。中田朋子さんの年齢は、3行目の4列目なので、getRange(3,4)となります。
複数行を取得する。
岩井さんから池田さんまで、年齢を全て表示します。セルが1つの時は、getValueを使いますが、セルが複数の場合はgetValuesメソッドを使います。
注意:
取得した値は二次元配列となっていますので、arr[縦インデックス][横インデックス]の様にインデックスを指定するか?for文で配列を先頭から取り出すなどします。
範囲を取得する。
全員の氏名から年齢までを取得します。取得する範囲の開始セルを指定して、そこから何行分、何列分取り出すかを指定します。
セル範囲を自動で取得する
セル範囲が固定しているのであれば、セル番号やセル範囲を指定して取得することで問題はありませんが、データが追加されて取得すべきセル範囲が変わることは良くあります。例えば、新しい社員が入社したり、退職したりすると社員名簿の取得すべきセル範囲は大きく変わります。
セル範囲を自動で判別して取得する
getDataRangeメソッドは、シートにデータが存在する範囲を自動的に判別してセル範囲を取得します。ここでは、社員名簿に2名を追加してみます。
データのあるA1からF7までの範囲が自動的に判別されて取得されたことが確認できます。
注意:
1行目や1列目を空白行や空白列とすると、空白行や空白列も含めたセル範囲が取得されますので注意願います。
最終行、最終列を自動で判別して取得する。
データが存在する最終行を取得するgetLastRowメソッドと、最終列を取得するgetLastColomnをgetRangeメソッドと組み合わせて使います。
列から「性別」を削除して、行から「池田沙也加」さんと「冴木美恵」さんを削除しました。
セル値の取得・セット
セル範囲の値を取得する。
RangeクラスのgetValueメソッドは、セル範囲のRangeオプジェクトから各セルに入力されている値を取得します。
getValuesメソッドでは、セル範囲の値は、2次元配列として取得されます。
セル範囲から「見出し行」を削除する。
getRange(“A2:F7”)という固定値で指定してセル範囲を取得する場合は、見出しを外して指定しますが、セル範囲を自動で取得するgetDataRangeメソッドを使って取得する場合は、1行目の見出し行も含まれてしまいます。
配列から先頭データを取り除くshiftメソッドでvaluesから見出し行のデータを削除します。
セル範囲に値をセットする。
RangeクラスのsetValueメソッドは、セル範囲に引数で指定した値をセットします。6行目と7行目に次の社員の名簿をセットします。
[“冴木美恵”,”さえきみえ”,”女”,39,”訪問介護員”,””],
[“静根裕典”,”しずねひろのり”,”男”,35,”訪問介護員”,”管理者”]