前回に引き続き、営業日報をサンプルにGoogle Apps Scriptの基本的な使い方を紹介する。今回は、作業しているスプレッドシートを添付ファイルとしてメールで送信するスクリプトだ。

サンプルは下記のような営業日報。入力項目は、訪問先、訪問時刻、報告内容といたってシンプルな内容。あたりまえだが、これらの項目は"スクリプトで自動入力"とはいかないので、手作業で行うことになる。

サンプルの営業日報スプレッドシート

営業日報といえば、その名の通り「報告」するもの。今回は、その日の営業内容を入力したシートを、上司に対してメールで毎日送るというシーンを想定している。

この中で、スクリプトが実行するのは次の部分だ。

  • 宛先を上司(TO)と自分(CC)にしてメールを送信する
  • スプレッドシートを添付ファイルとしてメールに付け加える
  • メールの件名には日付が入るようにし、本文は定型文を使用する

今回のメール送信では、先に内容を述べると、MailAppオブジェクトのsendEmailメソッドを使用した下記のコードがメインとなる。

MailApp.sendEmail(宛先, 件名, 本文, {オプション項目の指定});

実は、Apps Scriptでメールを送るのはとても簡単だ。一番シンプルな例は、下記の通り。順番に、宛先と件名、本文さえ指定すればよい。

function sendMailtest() {
    MailApp.sendEmail("test@exsampele.com", "テスト", "テストメールです");
}

これを実行すると、件名が「テスト」、本文が「テストメールです」というメールが、指定したメールアドレスに送信される。実行する際には、内容を確認するアラートが表示される場合がある。この場合は「承認」を選択すればよいが、この承認時点でいったんスクリプトが停止しているので、再度スクリプトを実行してみよう。

スクリプトの実行に承認を求めるダイアログが表示される

メールの送信は、このsendEmailメソッドが基本となる。今回は、ファイルを添付してメール送信するために少しだけ複雑になっている。下記が、スクリプト全体。それほど難しくはないので、順を追って見ていこう。

function sendMail() {
    var myBook = SpreadsheetApp.getActiveSpreadsheet();
    var mySheet = myBook.getActiveSheet();

    var subject = mySheet.getRange(15, 6).getValue();
    var to = mySheet.getRange(12, 6).getValue();
    var cc = mySheet.getRange(13, 6).getValue();
    var body = mySheet.getRange(17, 6).getValue();

    var attachment_Id = myBook.getId();
    var attachment = DocsList.getFileById(attachment_Id).getBlob();

    var attachmentFiles = new Array();
    attachmentFiles.push({fileName:attachment.getName(), mimeType: attachment.getContentType(), content:attachment.getBytes()});

    MailApp.sendEmail(to, subject, body, {cc:cc, attachments:attachmentFiles});

    Browser.msgBox("本日の営業日報を送信しました", Browser.Buttons.OK);
}

まず、varキーワードで変数をいくつか宣言している。変数「myBook」「mySheet」には、操作対象(現在アクティブな営業日報)のスプレッドシートオブジェクトやシートオブジェクトを格納している。

続く「subject」などの変数は、「mySheet(営業日報シート)」を対象に、シートに入力されている値を「getValue()」で取得している。取得先の指定は「getRange()」で、対象セルの指定はC1R1形式で行なっている。つまり「mySheet.getRange(15, 6).getValue()」は、「このシートの、15行目で6列目のセルの、値を取得 (して、変数Subjectに代入)」になる。「to」「cc」「body」も同様だ。

宛先などの項目はシートに入力したものを使用している

さらに、添付ファイルの操作に続く。Googleドライブには同じ名前のファイルも作成できるため、ファイル指定は名前ではなくIDを使用する。まず、「getId()」で開いている営業日報のIDを取得する。次にこのIDを利用して、ドライブの書類の中からIDで指定したファイルを、getBlobメソッドで取得する。

配列変数「attachmentFiles」を作成し、この中に、取得したファイルバイナリからファイル名やMIMEタイプなどを代入する。

そして、メインの「sendEmail」がやっと登場する。ここまでの処理はこのための準備。順に、宛先、件名、本文を指定するのは前述の通り。

それでは、CCや、ここでは利用しないがBCC、添付ファイルの指定はどうするかというと、4番目以降に「オプション名 : 値,」のように{}で囲って指定するわけだ。ちょっとわかりにくくなってしまったが「cc:cc」は、前がオプション名の「cc」、後ろが7行目で宣言した変数の「cc」だ。

最後の1行は、おまけ。スクリプトが終了したタイミングがわかりにくいので、メッセージを表示させている。

メール送信が完了するとメッセージボックスが表示される

Gmailで受信したメール例。営業日報が添付ファイルとして表示される

今回のスクリプトは動作がわかりやすいようにしたため、実際に使用する場合にはいくつか改善したい点もある。

たとえば、シートにメールアドレスや本文が書いているため、添付ファイルにもこの内容が入っている。解決方法はひとつではないが、このアドレスをスクリプト内に記述してしまう方法もある。下記は、5行~6行の宛先をスクリプト内に直書きしてみた例だ。とはいえ、このような短いスクリプトであればよいかもしれないが、メンテナンス性が低下する場合もあるので、使用する際は注意を。

    var to = "nakabayashi@exsample.com";
    var cc = "kobayashi@exsample.com";

ほかにも、送信が完了したら訪問先などを翌日のためにクリアしておくと便利かもとか、その日の日報をGoogleドライブに別名で保存しておきたいなどもあるかもしれない。

スクリプトを使うとさまざまな処理を自由に行える反面、何をしたいのか、どのようにすれば便利なのかなどじっくり考えることも必要になる。ぜひ、皆様も、業務を便利にするようなスクリプトに挑戦してみてほしい。