ウェブでよく使われるプログラミング言語の一つに JavaScript と呼ばれるものがあります。
Google Apps Script は JavaScript の文法に従って、Google の提供する様々なクラウドアプリを操作するためのプログラミングができるようにしたものです。
Google の提供するクラウドアプリには、例えば、スプレッドシート、ドキュメント、Gメール、フォームなどがあります。Apps Script を使うとこれらを自動的に操作したり、連携して作業実行することができるようになります。そして Google アカウントを持っている人(つまり Gmail アドレスを持っている人)なら誰でもすぐに使い始めることができます。
この記事では、プログラミングなどしたことがない人も含めて、最小限の知識で Google Apps Script プログラミングの文法の勘所が理解できるようになることを目指してみたいと思います。
目次
Apps Script ではどんなコードを書けば良い?
プログラムとは、コンピュータを制御するために書かれる指示書のようなもののことで、指示書には命令が並べられています。そして、このような指示書を書くときに何らかのプログラミング言語を使います。また、指示書はそれぞれのプログラミング言語特有のルールによって書かれ、そのルールは文法と呼ばれています。文法に従ってプログラムの中に書かれている指示、命令をコードと言います。
自動化サンプルプログラム
次のコードは Apps Script の公式解説ページ 自動化のクイックスタート からの引用です。
プログラミングをしたことがない人だと、めまいがするかもしれませんが、まず、「//」から始まる行だけでも、上から下へ順に読んでみてください。このプログラムが全体としてどんなことを実行するのかわかるはずです。
「//」から始まる行は「コメント」として扱われます。プログラムの実行時には無視され、なんの影響も与えません。プログラムの処理内容をわかるようにしておくために書かれるものです。
/**
* Google ドキュメントを作成し、ドキュメントを見ることのできる URL をメールでユーザー本人に送信する関数
*/
function createAndSendDocument() {
try {
// 'Hello, world!' という名前の Google ドキュメントを新規作成
const doc = DocumentApp.create('Hello, world!');
// 作成されたドキュメントに 'This document ... Script.'という文の段落を追加
doc.getBody().appendParagraph('This document was created by Google Apps Script.');
// ドキュメントの URL を取得
const url = doc.getUrl();
// ユーザー本人、つまりあなたのメルアドを取得
const email = Session.getActiveUser().getEmail();
// メールの題名のためにドキュメントの名前を取得
const subject = doc.getName();
// メール本文を、取得されているドキュメントの URL を表す文字列(つまり url 変数の値)の前に 'Link to your doc: 'という文字列を追加したものにする
const body = 'Link to your doc: ' + url;
// Gmail に送信先(今の場合あなた)、メールの題名、メール本文を設定して送信
GmailApp.sendEmail(email, subject, body);
} catch (err) {
// TODO (developer) - Handle exception
console.log('Failed with error %s', err.message);
}
}
「//」から始まる行を上から順に読んで全体の流れがつかめたところで、このプログラムについてもう少し詳しく見てみることにしましょう。
関数
このプログラムでは、一行目に function という言葉が書かれています。
function から始まるものは「関数」と呼ばれるものです。
関数は、いくつかの情報を受けとり、受け取った情報に対して何らかの処理を行い、必要に応じてその結果を返すという作業を行うものです。また関数は、プログラムが実行され進行していく中のどこかで呼び出されて使われます。
ですから、関数を自作する場合
- どんな情報を受け取るのか
- どんな処理を行うのか
- 結果を呼び出し元へ返すかどうか
ということを定義します。
実は、上の自動化サンプルプログラムでは、この関数はどこからも呼び出されません。ですからこの関数を呼び出すコードをどこかに書いてプログラムを実行したり、何かしらの仕掛けを用いてこの関数を呼び出さない限り何も起こりませんが、Google Apps Script ではドキュメントやスプレッドシートなどのアプリの操作やあらかじめ決めたスケジュールをもとに関数を呼び出す仕掛けが用意されています。
「呼び出される」とか「結果を呼び出し元へ返す」というのがどんなことなのか腑に落ちない人も多いかもしれませんが、今は気にせず先に進むことにしましょう。のちに関数の呼び出しについて簡単に説明をします。
JavaScript では、関数を定義するとき
function 関数名(受け取る情報1, 受け取る情報2,..., 受け取る情報n){
処理内容;
.
.
.
処理内容;
}
という形の記述をします。
まず、function という言葉を書き、
その次にわかりやすい名前を考えて関数名を書き、
その次に ( ) で囲んで受け取る情報を表す変数を必要なだけ並べ、
その次に { } で囲んで実行したい処理を順に書く
ということです。
多くの場合、{ } の中には複数の行に渡って実行したい処理を表す文が並べられます。一つ一つの処理内容の最後に ; をつけていることにも気をつけてください。JavaScript では文の終わりに ; をつけます。
また、結果を返す必要があるときには、すべての処理が終わったあとに return 文というものを使って、
function 関数名(受け取る情報1, 受け取る情報2,..., 受け取る情報n){
処理内容;
・
・
・
処理内容;
return 返す情報;
}
というように書きます。
実際にはすべての処理が終わる前に return があらわれることもあります。
今回の自動化サンプルプログラムにはあらわれませんが、JavaScript で書かれた関数のごく簡単な例を次に示しておきます。
function add(x, y){
const w = x + y;
return w;
}
この関数は、次のようなものとして定義されています。
- この関数の名前を「add」としました。
- この関数は2つの情報 x と y を受け取ります。(ただし、暗黙的に x と y は数であることを想定しています。また、 x と y は様々な数になれることを想定しています。)
- この関数は x と y の値を足したものを w に代入するという処理を実行します。
- この関数は最後に結果 w を返します。
関数において、受け取る情報は「引数(ひきすう)」と呼ばれます。また、返す情報は「戻り値」や「返り値」と呼ばれます。ですからこの関数「add」 では、引数は x と y、戻り値は w ということになります。
引数の無い関数も定義することができます。
その場合、() の中には何も書かれません。
関数の呼び出し
次のコードは、まず2つの数を足した値を計算して呼び出し元へ返す関数 add を定義し、変数 p と q に値を設定し、関数 add を呼び出して結果を元へ返してコンソールに表示するという処理をするプログラムです。
// 関数 add の定義
function add(x, y){
let w = x + y;
return w;
}
const p = 5; // 変数 p の値を 5 にする
const q = 7; // 変数 q の値を 7 にする
const s = add(p, q); // 引数として値の代入されている p と q を与えて関数 add を呼び出し、戻り値を変数 s に代入
console.log(s); //s の値をコンソールに出力 結果は 12 となるはず
9 行目で関数 add を呼び出して使っています。
詳しく言うと、この行では、引数として値の代入されている p と q を与えて関数 add を呼び出し、関数 add に処理を実行させ、戻り値を変数 s に代入しています。
このプログラムには、console.log というものがあらわれています。これは実行結果を コンソール というところに出力して表示するという命令です。コンソールは、ウェブブラウザの中で見ることができます。詳しいことについて、今は気にする必要はありません。
変数
変数とは何らかのデータを入れておくための箱のような役割を果たすものです。
プログラム中で変数を使うとき、「宣言」と「代入」ということが行われます。そして、変数には「型」と呼ばれる概念があります。
JavaScript のコードでは、変数の前に、const、let、var という言葉がついていることがあります。
これらのことについて以下ごく簡単に説明することにします。
宣言
プログラム中である名前の変数を初めて使おうと考えたとき、まず、「その名前の変数を使います」という宣言をする必要があります。
例えば、「これから初めて p という名前の変数を使います」と宣言したい場合は、
const p;
とか、
let p;
のように記述します。
p の前に、const または let がつけられています。これにより、次のような違いが出ます。
const が前につけられて宣言された変数は一度値が与えられるとその後変更はできなくなります。(再代入不可)
let が前につけられて宣言された変数は何度でも値を変更できます。(再代入可能)
代入
宣言が終わった変数には値を代入することができます。
const p; // (再代入不可の)変数 p の宣言
p = 7; // p に 7 を代入
p = 2; // エラーが出る
let q; // (再代入可能の)変数 q の宣言
q = 12; // q に 12 を代入
q = 4; // q に 4 を再代入
宣言と代入を同時に行う
次のように、変数の宣言と代入を同時に行うこともできます。
const p = 7; //再代入不可の変数 p を宣言し、7 を代入
let q = 12; //再代入可能の変数 q を宣言し、12 を代入
どんどん使われなくなってきている var
var をつけて宣言した変数は const、let とは違い、再宣言ができます。
つまり、
var p = 7; // 整数を扱うつもりで変数 p を宣言し、値 7 を代入
何らかの処理
・
・
・
何らかの処理
var p = "あいうえお"; // p は整数を扱うつもりの変数だったことを忘れて、p を文字列を扱うための変数として再宣言し、値 "あいうえお" を代入
のようなことが可能です。これって、時と場合により、結構危険ですよね。
この他にも、var にはスコープの問題や変数の巻き上げという問題があります。スコープや巻き上げについては検索エンジンを使って調べてみてください。
現在 JavaScript では const と let だけを使うことが多くなってきています。
で、とりあえずどう使い分ける?
- まず、const を使う
- 再代入される機会があるものは let を使う
- var は使わない
あまりややこしいことをしないなら、これぐらいの認識で大丈夫でしょう。
型
コンピュータが扱うデータには様々なものがあります。
例えば、典型的なものとしては「数」や「文字列」、さらに真偽を表す「真偽値」と呼ばれるものがあります。
また例えば、やや難しげなものとして「配列」や「連想配列」などがあります。
さらに例えば、なかなかピンと来ないものとして、「オブジェクト」と呼ばれるものもあります。オブジェクトについては後に簡単に説明します。
プログラミング言語ではこれらのデータを「型」という概念によって分類して扱います。(ただし「型」の扱いはプログラミング言語によっていろいろと違いがあります。)
JavaScript でデータを変数に代入して扱うとき、変数はデータに対応する「型」を持つことになります。
例えば、
const p = 21;
のように、変数 p を宣言して p に 21 を代入すると、変数 p は「数値型」の変数ということになります。
また、例えば、
const p = 'あいうえお';
のように、変数 p を宣言して p に ‘あいうえお’ を代入すると、変数 p は「文字列型」の変数ということになります。
JavaScript では、文字列は全体をシングルクォート「’」またはダブルクォート「”」で囲んで使います。どちらを用いても構いません。ただし、文字列の中にシングルクォート「’」が含まれてい場合はその文字列全体をダブルクォート「”」で囲み、ダブルクォート「”」が含まれている場合はその文字列全体をシングルクォート「’」で囲みます。
さらに、例えば、
const g_doc_app = DocumentApp;
のように、変数 g_doc_app を宣言して g_doc_app に DocumentApp を代入すると、 g_doc_app はオブジェクト型の変数ということになります。
JavaScript では、データを次の8つの型に分類して扱っています。
- Boolean (論理値)。true または false。
- null。null 値を意味する特殊なキーワード。
- undefined (未定義)。値が未定義。
- Number (数値)。整数または浮動小数点数。例えば 42 や 3.14159 など。
- BigInt (長整数)。精度が自由な整数値。
- String (文字列)。テキストの値を表す連続した文字。
- Symbol (シンボル)。インスタンスが固有で不変となるデータ型。
- Object(オブジェクト)
いま、これらについて厳密な理解をしていなくても問題はありません。
詳しいことは、文法とデータ型 – JavaScript | MDN – MDN Web Docs
を見てください。
オブジェクト
冒頭の自動化サンプルプログラムにはとりあえず3人の人が登場します。それは、
- DocumentApp
- Session
- GmailApp
という3人です。そしてこの3人に何らかの処理を実行してもらうという形でプログラムが進行していくようになっています。
DocumentApp は Google のサービスで提供されている「Google ドキュメント」というクラウドで使うワープロアプリそのもののことです。
Session は、「Googleアカウントユーザーがもつ様々な情報へアクセスする仕事を担当する人」のようなものです。
GmailApp は Google のサービスで提供されている「Gmail」というメールアプリそのもののことです。
例えばこの自動化サンプルプログラムでは、
DocumentApp.create('Hello, world!');
と書かれているところがあります。ここでは、「DocumentApp さん、Hello, world というファイル名の文書(ただし中身はまだない)を作成してください」という依頼をしています。
正確には、
const doc = DocumentApp.create('Hello, world!');
というようにして、doc という名前の変数を宣言し、作成してもらった文書を変数 doc へ代入し、この先は、プログラム中でその文書を doc という名前で扱えるようにしています。
このようにして、プログラムを擬人化し、担当する仕事を決め、お互いに仕事を依頼するという形で作業を実行できるようなプログラミング言語はオブジェクト指向プログラミング言語と呼ばれています。そして擬人化されたそれぞれの「モノ」はオブジェクトと呼ばれます。
オブジェクトと似たような意味で使われる言葉に、インスタンス、クラスという言葉がありますがここでは触れないことにします。
オブジェクトのプロパティとメソッド
擬人化されたそれぞれの「モノ」、つまりオブジェクトはそれぞれに特有の「プロバティ」と「メソッド」と呼ばれるものを持っています。この2つによって、それぞれのオブジェクトが使うことができる「道具(データやモノ)」と「担当する仕事」が決められています。
プロパティ
オブジェクトは「扱うことができるデータ」や「扱うことのできる別のオブジェクト」を所有していることがあります。
例えば、DocumentAppさんというオブジェクトは、ParagraphHeadingさんや TextAlignmentさんという名前のオブジェクトを始めとして、いくつかのオブジェクトを所有しています。このことにより、DocumentAppさんは ParagraphHeadingさんや TextAlignmentさんを自分の一部として使うことができるようになっています。ParagraphHeadingさんや TextAlignmentさんもオブジェクトなのでそれぞれ何かしらのプロパティとメソッドを持っていることにも注目してください。ですから、DocumentAppさんは ParagrahHeading さんや TextAlignmentさんが持っているプロパティやメソッドを自分で使うことができるようになっています。
このような説明をされてもなかなかピンと来ないかもしれませんが、この先の説明にあわわれる多くのコードを見るとわかるようになるでしょう。
メソッド
オブジェクトが実行できる仕事(作業項目と言っても良いかもしれません)をメソッドと呼びます。
例えば、DocumentAppさんには、
- 新しいドキュメントを作成して呼び出し元へ返すcreate メソッド
- 指定された ID のドキュメントを返す openById メソッド
- 指定された URL のドキュメントを開いて返す openByUrl メソッド
などを始めとするいくつかのメソッドがあります。
Google ドキュメントで文書を作ると、自動的に一意の ID や URL が与えられます。ですから、ID や URL を使って、文書を指定したり文書にアクセスすることができます。
このような仕事を DocumentAppさんに頼むには、
// DocumentAppさん、'業務日報'という名前の Google ドキュメントを作成してください
DocumentApp.create('業務日報');
// DocumentAppさん、ID が 'abc1234567'の Google ドキュメント を開いてください
DocumentApp.openById('abc1234567');
// DocumentAppさん、Url が 'https://docs.google.com/document/d/1234567890abcdefghijklmnopqrstuvwxyz_a1b2c3/edit'の Google ドキュメントを開いてください
DocumentApp.openByUrl(
'https://docs.google.com/document/d/1234567890abcdefghijklmnopqrstuvwxyz_a1b2c3/edit',
);
のように記述します。つまり、
オブジェクト.メソッド(必要な引数);
というように、「.(ドット)」でオブジェクトとメソッドをつないで記述します。
メソッドは関数と同様に、引数を取るものがあること、戻り値を返すものがあることにも注意してください。
メソッドが戻り値を返す場合、新たに変数を用意し、戻り値を変数に代入することもできます。
例えば、DocumentAppさんの create メソッドは戻り値として Documentクラスのオブジェクトを返します。(Documentクラスのオブジェクトは、Google Document というアプリで作成できるそれぞれの文書そのものです。)
そしてこの記事の最初に紹介した自動化サンプルプログラムでは、次のようなコードがあらわれていました。
const doc = DocumentApp.create('Hello, world!');
このコードでは、「DocumentAppさん、’Hello, World’ という名前の文書を作ってください。」として戻り値として Documentクラス のオブジェクトを返してもらい、 (再代入不可の)変数として宣言した doc に代入しています。その結果、この、自動化サンプルプログラムの中ではこの文書を doc という名前で扱うことができるようになります。
DocumentAppさんについての詳しいことは Apps Script 公式ページ Class DocumentApp を見てください。
Google ドキュメントがオブジェクトによって作られていく様子
さて、DocumentAppさんがメソッド create を使って作成し変数 doc に代入されたオブジェクトは Documentクラスのオブジェクトでした。ですから docさんには Document クラス特有のプロパティやメソッドがあります。というわけで、プログラム中で docさんにはそれらのプロパティやメソッドを使って仕事をするように頼むことができます。
実は、Documentクラスのオブジェクトには getBody というメソッドがあります。(このメソッドに引数はありません。)これは、文書のボディー(つまり、Google ドキュメントで本文が書かれる領域)を取得するメソッドです。
ですから、「docさん、あなたのボディーを取得してください」と頼むには、doc.getBody() のようにドットつなぎでオブジェクトとメソッドをつなげばよいわけです。そしてさらに、得られたボディーを、例えば body という名前の変数に代入したければ、
const body = doc.getBody();
とすればよいことになります。
getBody メソッドは Body クラスのオブジェクトを戻り値として返すようになっています。つまり、変数 body に代入されたものは Body クラスのオブジェクトです。ですから bodyさんには Body クラス特有のプロパティやメソッドがあります。というわけで、こんどはプログラム中で bodyさんにそれらのプロパティやメソッドを使って仕事をするように頼むことができます。
実は、Body クラスのオブジェクトには appendParagraph というメソッドがあります。そしてこのメソッドには文字列を引数として与えることができます。これは、文書のボディーに引数として与えられた文字列が書かれた段落を付け加えるメソッドです。
ですから、「bodyさん、’This document was created by Google Apps Script.’という文字列が書かれた段落を追加してください」と頼むには、body.appendParagraph(‘This document was created by Google Apps Script.’) のように、ドットつなぎでオブジェクトとメソッドをつなげばよいわけです。そしてさらに、得られた「モノ」を、例えば para という名前の変数に代入したければ
const para = body.appendParagraph ('This document was created by Google Apps Script.');
とすればよいわけです。
ところで、appendParagraph メソッドは Paragrahクラスのオブジェクトを戻り値として返すようになっています。つまり、変数 para に代入されたものは Paragrah クラスのオブジェクトです。
ここまでを簡単に振り返ってみましょう。
まず、DocumentAppさんに create メソッドを使ってもらい Document クラスのオブジェクト(つまり文書そのもの、ただし中身は空)を作り、変数 doc に代入しました。
そして、doc さんに getBody メソッドを使ってもらい Body クラスのオブジェクト(文書で本文が書かれる領域)を取得し、変数 body に代入しました。
さらに、body さんに appendParagraph メソッドを使ってもらい Paragrah オブジェクト(本文のなかに配置する段落)を作り、本文に ‘This document was created by Google Apps Script.’ と書かれた段落を付け加えました。
以上のようなコードを書くことによって Google Apps Script では Google ドキュメントをプログラムで作成できるようになります。
つまり、Apps Script では Googleドキュメントは Document、Body、Paragraph などの階層化されたオブジェクトとして扱われ、それぞれのオブジェクトにメソッドを使って何らかの仕事をしてもらうというようにして文書を作成していきます。
Document、Body、Paragraphについての詳しいことはそれぞれ以下の Apps Script 公式ページを見てください。
Google ドキュメントには Document、Body、Paragraph 以外にも、見出しを扱う ParagraphHeading、ヘッダー扱う HeaderSection など、文書を構成する要素となるたくさんのオブジェクトがあります。
Google ドキュメントが扱うすべてのオブジェクトについての詳しいことは
Document Service を見てください。
自動化サンプルプログラムの説明
自動化サンプルプログラムは関数 createAndSendDocument が定義されていて、
function createAndSendDocument() {
try {
何らかの処理;
・
・
・
何らかの処理;
}catch (err) {
// TODO (developer) - Handle exception
console.log('Failed with error %s', err.message);
}
という形をしています。
try…catch については後に簡単に説明することにして、ここではこの関数の実質的な処理をすべて実行する「try のあとの { } で囲まれた部分」について説明していきます。
ではこれからもう一度、自動化サンプルプログラムを詳しく見てみることにしましょう。
/**
* Google ドキュメントを作成し、ドキュメントを見ることのできる URL をメールでユーザー本人に送信する関数
*/
function createAndSendDocument() {
try {
// 'Hello, world!' という名前の Google ドキュメントを新規作成
const doc = DocumentApp.create('Hello, world!');
// 作成されたドキュメントに 'This document ... Script.'という文の段落を追加
doc.getBody().appendParagraph('This document was created by Google Apps Script.');
// ドキュメントの URL を取得
const url = doc.getUrl();
// ユーザー本人、つまりあなたのメルアドを取得
const email = Session.getActiveUser().getEmail();
// メールの題名のためにドキュメントの名前を取得
const subject = doc.getName();
// メール本文を、取得されているドキュメントの URL を表す文字列(つまり url 変数の値)の前に 'Link to your doc: 'という文字列を追加したものにする
const body = 'Link to your doc: ' + url;
// Gmail に送信先(今の場合あなた)、メールの題名、メール本文を設定して送信
GmailApp.sendEmail(email, subject, body);
} catch (err) {
// TODO (developer) - Handle exception
console.log('Failed with error %s', err.message);
}
}
では、一文一文見ていくことにします。
// 'Hello, world!' という名前の Google ドキュメントを新規作成
const doc = DocumentApp.create('Hello, world!');
これについてはもう説明の必要は無いでしょう。
// 作成されたドキュメントに 'This document ... Script.'という文の段落を追加
doc.getBody().appendParagraph('This document was created by Google Apps Script.');
ここではドットつなぎが二箇所あるのがわかります。
これは、「オブジェクト docさんにgetBodyを使って仕事をしてくれと依頼する」ということと、「その結果得られたオブジェクト(doc.getBody())に appendParagraphを使って仕事をしてくれと依頼する」という2つの依頼を一行にまとめて書いたものです。慣れてくると、このような書き方で無駄を省くことができますが、慣れないうちは、先に長々と説明したように、1つ1つ書くようにしたほうがわかりやすいでしょう。
// ドキュメントの URL を取得
const url = doc.getUrl();
いま、doc は Documentクラスのオブジェクトでした。Documentクラスは getUrl というメソッドを持っています。Google ドキュメントで作られるそれぞれの文書はインターネット上に存在し、ウェブページと同様に それぞれの URL を持っています。getUrl メソッドは文書の URL を取得して返すメソッドです。ここでは、文書の URL を取得し変数 url に代入しています。
// ユーザー本人、つまりあなたのメルアドを取得
const email = Session.getActiveUser().getEmail();
Session は、「このプログラムを実行する Googleアカウントユーザーがもつ様々な情報へアクセスする仕事を担当する人」のようなオブジェクトでした。
ここでは、まず Session に getActiveUser メソッドを使って現在このプログラムを実行しているユーザーを取得するように依頼し、さらに、その結果得られた Session.getActiveUser() (これはUser クラスのオブジェクトになる)にgetEmail メソッドを使ってそのユーザーのメールアドレスを取得するように依頼し、得られたメールアドレスを変数 email に代入しています。
// メールの題名のためにドキュメントの名前を取得
const subject = doc.getName();
ここでは、doc に getName メソッドを使って文書の名前を取得するように依頼し、得られた名前を変数 subject に代入しています。
// メール本文を、取得されているドキュメントの URL を表す文字列(つまり url 変数の値)の前に 'Link to your doc: 'という文字列を追加したものにする
const body = 'Link to your doc: ' + url;
Javascript では、2つの文字列をつないでできる文字列を作るとき、2つの文字列を「+」でつなぎます。(これとは違う方法もあります。)ここでは、’Link to your doc: ‘という文字列と、先程変数 url に代入された文字列をつないでできいる文字列を変数 body に代入しています。
// Gmail に送信先(今の場合あなた)、メールの題名、メール本文を設定して送信
GmailApp.sendEmail(email, subject, body);
GmailApp は Google のサービスで提供されている「Gmail」というメールアプリそのもののでした。ここでは GmailApp に sendEmail メソッドを使ってメールを送信するように依頼しています。
sendEmail メソッドには 送信先アドレス、題名、本文を始めとするいくつかの引数を与えることができます。ここでは、既に宣言、代入を行った変数 email、subject、body に代入されているものをそれぞれ送信先アドレス、題名、本文として引数に与え、メールを送信するように依頼しています。
以上が自動化サンプルプログラムが実行する内容です。
このプログラムで定義した関数は、あらかじめ決められた名前であらかじめ決められた内容のドキュメントをつくり、そのドキュメントの名前を題名として本文中に URL が書かれたをメールを自分に送るだけのものです。ですから、繰り返し何回も実行したりすることも無いでしょうし、実行する内容にも実用性はありません。実際に日頃の業務で自動化して実行したい作業はもっと複雑で条件によって扱うデータも変化することでしょう。そしてそのようなプログラムはこの自動化サンプルプログラムのような簡単なものでは済まないことでしょう。ですが、この自動化サンプルプログラムでは Apps Script がおよそどのような考えで設計されて作られたプログラミング言語なのかなんとなく想像できます。
この自動化サンプルプログラムで登場した Google Apps Script が用意している各オブジェクトが持つプロパティやメソッドについての詳しいことは、以下のリンクから公式リファレンスを見てください。
try…catch について
目的とする動作を正しく実行するようにプログラムを作ることも結構大変ですが、「普通は起きないこと」が起きたときにどうするのかということを考えておくことも重要です。
例えば、インターネット回線は不安定なことがあるので、通信が遮断されプログラムが実行できないなどということも起こりえます。また、メールの送信では予期せぬエラーが発生することもあります。
そのようなことが起きたとき、プログラムはエラーを吐きストップしますが、単にストップさせるのではなく、エラーが起きたらこちらの意図を反映した何かしらの処理を行ってほしいということもあります。
たいてい、どのプログラミング言語にも、そのような事態に対応する仕組みが用意されていて、例外処理と呼ばれています。
JavaScript では、例外処理を行うプログラムにしたいときは、
try {
// tryブロック
// ここには本来実行したい処理で、エラーが発生するかもしれない処理を書く
// ある処理でエラーが発生すると、発生したあとの処理は実行されず、catchブロックへ処理が移行する
// エラーの内容は catch () の () の 中に記載されている変数に格納される
}catch (e) {
// catchブロック
// ここにはエラーが発生した場合に実行したい処理を書く
// tryブロックから投げられてきたエラーは変数 e に代入されている
// e に含まれている情報を使った何らかの処理を書くなどする。
}
という記述をします。
自動化サンプルプログラムでは、
try{
// 本来実行したい処理
} catch (err) {
// TODO (developer) - Handle exception
console.log('Failed with error %s', err.message);
}
となっています。 try ブロックでエラーが発生すると例外と呼ばれるものが catch ブロックへ投げられ、この catchブロックでは err という変数で例外を受け取っています。投げられてきた例外 err には、発生したエラーの情報が含まれています。ここでは、console.log という命令を使って、コンソールに 「’Failed with error %s’ という文字列の %s の部分に err に含まれている メッセージを入れたもの」を表示するようにしています。
例外処理についても更にいろいろ学ぶことがありますが、検索エンジンなどを使って調べてみてください。
次回は、Google Apps Script の公式ページ カスタム関数のクイックスタート にあるサンプルプログラムを詳しくみてみることにします。このサンプルプログラムで定義される関数は、スプレッドシートで自作関数として使うことができるようになります。
そして、さらにその次の回では、Google Apps Script でプログラミングを行うときに使う専用 Editor の使い方を見てみたいと思います。