Google Apps Script 入門

目次

事前準備と確認

(1) Google アカウント

Android スマートフォンを使っていたり、Gmail を使っている人はおそらくもう持っています。 学校や職場から発行されている Google Workspace (旧称:G Suite) アカウントでもOKです。 Google アカウントを持っていない人・別に新しく作りたい人は こちら から作成してください。

(2) 公式ドキュメント

公式ドキュメント: Google Apps Script の "Learn Apps Script" (上のメニューバーにあります) 以下にある Guides と Reference は特によく参照します。

Google Apps Script を一通り体験

まずは Google Apps Script を書くのはどういう感じかチュートリアル形式で一通り体験していきましょう。 題材としては「Google Spreadsheet のデータを使って、少しずつ内容が違う案内メールを一斉送信する」プログラムを扱います。

(1) Google ドライブ上でファイルを作成

Google Apps Script では、何かしらの Google アプリのファイルを操作することが多いです。 その場合、操作対象となるファイルの方を先に作成しておくと簡単です。 今回は新しいスプレッドシートを作成するところから始めましょう。

  1. Google ドライブ を開きます
  2. (お好みで) フォルダを作ります 左上の「新規」ボタンから作れます 作らなくても別にOKです
  3. 同じく「新規」ボタンから「空白のスプレッドシート」を作ります

こちらの共有フォルダ に置いたサンプル「メール一斉送信」のように少し中身を記入しましょう。

(2) スクリプトエディタを開く

下図のようにメニュー「拡張機能>Apps Script」からスクリプトエディタを開きます。そこにプログラムを書いていきます。

(3) プログラムを書く

下図のようにスクリプトエディタにプログラムを書くことができます。関数を作成すると、作成した関数のリストがツールバーに表示されます。 「無題のプロジェクト」とあるところをクリックしてプロジェクト名も付けておくとよいでしょう。

以下のプログラムをスクリプトエディタにコピペしましょう。 スプレッドシートから値を読み込み、その後繰り返しを使って1行につき1メールを送信するようになっています。 メールの内容を作成する部分がやや長いですが、送信自体はたった1行で簡単です。今は送信したくないのでその代わりに下書きを作成しています。

function sendEmails() {
  let ss = SpreadsheetApp.getActive(); // このスプレッドシートファイルの
  let sheet = ss.getActiveSheet(); // このシートに
  let values = sheet.getDataRange().getValues(); // 記入されている値を読み込む

  for(let i = 0; i < values.length; i++){ // 1行ずつ繰り返す
    let row = values[i]; // i行目
    let address = row[1];
    let subject = "実験日時および場所のお知らせ";
    let body = row[2] + "さま、\n\n"; // \n は改行
    body += "西田です。\n\n";
    body += "このたびは実験にご協力いただきありがとうございます。\n";
    body += "調整の結果、" + row[2] + "さまの実験は以下の日時・場所で行うことになりました。\n\n";
    body += "日時:" + row[3] + "\n";
    body += "場所:B408\n\n";
    body += "よろしくお願いします。";

    GmailApp.createDraft(address, subject, body); // 下書きを作成する
    // GmailApp.sendEmail(address, subject, body); // 直接送信する場合はこちらを使う
  }
}

(4) 実行する(※初めて実行するときだけ承認の確認が必要)

では早速実行ボタンを押してみましょう。初回実行時にはプログラムを動作させていいかの確認が必要になります。 ちょっと怖い文章ですが、自分で作ったプログラムですので承認してOKです。 設定によっては英語で表示される場合もありますが、内容は同じはずです。

初回実行時の承認(1) これから承認作業が始まりますという確認

「権限を確認」をクリックしてください。次に、アカウントを選択するように指示されるので選択してください。

初回実行時の承認(2) Googleが確認していないという警告

この警告は出る場合と出ない場合がありますので、出なかった場合は次に進んでください(大学アカウントだと出ない?)。 自分で今作ったばかりのプログラムですので、Googleによる確認がなされていないのは当然です。 左下の「詳細」をクリックして、その後「~(安全ではないページ)に移動」をクリックしてください。

初回実行時の承認(3) 承認する内容の確認と承認

実行しようとしているプログラムが分析され、承認が必要な内容がリストアップされます。 たとえば、メールを送るプログラムであればメールを送ることを承認することになります。 リストに目を通して問題がなければ「許可」をクリックしてください。

承認が済んだら実行されます。Gmailの下書きを見てみてください。

補足:Google Apps Script はクラウドで動く

普段あまり意識することはないかもしれませんが、 Gmail や Google Drive で扱うメールやファイルは Google のコンピュータ上に存在して、主だった処理は Google のコンピュータ上で行われています。 俗にいう「クラウド」ですね。 同様に、 Google Apps Script で作成したプログラムも Google のコンピュータ上に存在し、実行されています。 実行ボタンを押すと、 Google のコンピュータ上でプログラムが実行され、Gmail 等に操作がなされ、その結果がブラウザに表示されるというわけです。

GAS では自分のコンピュータ上にあるファイルを操作するようなプログラムを作ることはできないので、そういったことがしたい場合には他のものを使うことになります。

ほかにどんなことができる?

続いて、Google Apps Script を使ってほかにどんなことができるのか、いくつかの事例を見ていきましょう。 やや難しいところもありますが、最初はなんとなく把握すればOKです。 どんなことができるのか知っていれば、ウェブ検索で参考になる記事がたくさん見つけられると思います。

例:Webスクレイピング

ウェブページからデータを抽出する「Webスクレイピング」なども Google Apps Script でできます。

補足:スプレッドシート関連の用語

先に進む前にスプレッドシートを使うときやプログラムを作るときに混乱しやすい用語を確認しておきましょう。

スプレッドシート
1つのファイルのこと。たとえば SpreadSheetApp.getActive() の結果は「スプレッドシート」です。
シート
1つのファイルに含まれる1つ以上の名前付きタブのこと。
たとえば getSheetByName("名前") の結果は「シート」です。その名前のシートがない場合、結果は null になり、その後の処理でエラーが出ます。

以下の例ではプログラムを実行する前に「result」という名前のシートを作成しておく必要があります。

function hot100(){
  let url = "http://www.billboard-japan.com/charts/detail?a=hot100"; // 取得するページのURL。一度ブラウザで開いて見てみるといいでしょう。
  let response = UrlFetchApp.fetch(url);
  let text = response.getContentText(); // 取得したHTML文字列

  let ss = SpreadsheetApp.getActive();
  let sheet = ss.getSheetByName("result");

  let pattern = /<p class="musuc_title">([^<>]*)<\/p>/g
  let match;
  while(match = pattern.exec(text)){
    sheet.appendRow([match[1]]);
  }
}

定期的にチェックしているウェブページがあるような人はこういう方法で自動化してみるのもいいかもしれませんね。 定期的にウェブをチェックすることが必要な卒論テーマなんかもあるかもしれません。 第3回 では LINE bot の作り方を学びますが、ウェブから取ってきたデータを使う bot を作るのもおもしろいでしょう。 ただし、昨今は自動巡回プログラムの類からのアクセスを拒否する設定にしているページも多いです(例:メルカリ)。

実は簡単なWebスクレイピングは Google スプレッドシートの importhtml 関数や importfeed 関数(RSSの場合) を使うだけでもできてしまいます。 こちらの共有フォルダ にある「ウェブ巡回」のスプレッドシートに例を示しましたので見てみてください。 ちなみに Twitter などログインが必要なページから情報を取ってくるのことも(難しい&手間ですが)できます。

例:文字数カウント

次のプログラムは、フォルダにある Google Document の文書をすべて分析して、それぞれの文字数をスプレッドシートに記録するプログラムです。 ゼミ生みんなで同じフォルダに卒論原稿を置いて進捗を共有する場面なんかをイメージしています(他大学の話ですが、実際にこのようなことをしているゼミもあると聞いたことがあります)。 こちらの共有フォルダ の「文字数カウント」フォルダにテスト用の文章を用意しました。

function count() {
  let ss = SpreadsheetApp.getActive(); // このスプレッドシート
  let parents = DriveApp.getFileById(ss.getId()).getParents(); // を含む親フォルダ
  let row = [new Date()]; // 後にスプレッドシートに追記される配列

  while(parents.hasNext()){
    let p = parents.next();
    let docs = p.getFilesByType(MimeType.GOOGLE_DOCS); // 親フォルダに含まれる文書ファイルすべて(つまり、スプレッドシートと同じフォルダ中の文書)

    while(docs.hasNext()){
      let file = docs.next();
      let doc = DocumentApp.openById(file.getId()); // 文字数を数えるためにドキュメントを開く(実際に画面上で開くわけではない)
      let textLength = doc.getBody().getText().length; // 本文の文字数を取得
      row.push(textLength); // 配列に追加する
    }
  }

  ss.getActiveSheet().appendRow(row); // スプレッドシートに配列を1行として追記
}

さらに、指導教員にメールで知らせる機能とかゼミのグループLINEに報告する機能なんかを作ってもいいかもしれませんね。

トリガー

ここまで、作成したプログラムは実行ボタンを押して手動で実行してきました。 Google Apps Script ではそれ以外に、指定したタイミングでプログラムを実行する「トリガー」という機能があります。 たとえば「毎朝 9:00 にメール送信プログラムを実行する」「1時間ごとに文字数カウントプログラムを実行する」ことなどができます。 自分のPCでプログラムを定期的に動かそうと思うと電源をつけっぱなしにする必要があったりして困るのですが、 Google Apps Script ではその心配もないので大変便利です。

バグのあるプログラムを定期的に実行するのは地獄なので、うまく実行できることを確認してからトリガーを設定するのが普通です。

トリガーを設定するにはまず左にある目覚まし時計みたいなボタンを押してトリガー設定画面を開きます (下図)。次に「トリガーを追加」ボタンを押して、トリガー追加ダイアログを開きます。

トリガーは関数単位で設定します。実行するタイミングを選んで「保存」を押せば設定完了です。

演習