連載
» 2018年10月22日 05時00分 公開

一から作ると面倒な日報メール――GASで実現する半自動化術とは働く価値を上げる“VBA/GAS”術(12)(3/3 ページ)

[高橋宣成,プランノーツ]
前のページへ 1|2|3       

アクティブなスプレッドシートを取得する

 今回は同じスプレッドシートの2つのシートを操作するので、まずスプレッドシートを取得します。スプレッドシートのコンテナバインドでスクリプトを作成すれば、アクティブなスプレッドシートを取得する下記の「getActiveSpreadsheet()」メソッドを使用できます。

SpreadsheetApp.getActiveSpreadsheet()

 こうして取得したスプレッドシートを変数ssに格納すれば、2つのシートを取得する際に使用できます。

var ss = SpreadsheetApp.getActiveSpreadsheet();

シート名でシートを取得する

 続いて、下記のステートメントを解説します。

var reports = ss.getSheetByName('レポート').getDataRange().getValues();

 最終的にセルのデータを取得するのが目的です。それには、「スプレッドシート→シート→セル範囲→値」という順に取得する必要があります。スプレッドシートからシート名を使ってシートを取得するのが、「getSheetByName()」メソッドです。

Spreadsheetオブジェクト.getSheetByName(シート名)

 シート名を文字列で指定することで、そのシートをSheetオブジェクトとして取得します。

データのあるセル範囲を取得する

 シートを取得できれば、次はセル範囲つまりRangeオブジェクトを取得します。そのときに便利なのが、「getDataRange()」メソッドです。

Sheetオブジェクト.getDataRange()

 getDataRange()メソッドは、シート上のデータがある範囲を自動で認識して、A1セルからデータが存在している範囲までをRangeオブジェクトとして取得するメソッドです。例えば、「レポート」シートであれば「A1:C4」を、「フォーマット」シートであれば「A1:B5」をRangeオブジェクトとして取得します。

 そのデータのあるセル範囲について、getValues()メソッドで2次元配列としてデータを取得します。従って、「レポート」シートのデータは、変数「reports」に、「フォーマット」シートのデータは、変数「vlaues」に2次元配列として格納されます。

シートから取得した2次元配列についてのループ

 取得した2次元配列reportのループを回して、メッセージの本文に挿入する文字列を作成します。その処理をしているのが下記です。

var report = '';
for(var i = 1; i < reports.length; i++){
  report += reports[i][0] + '/'; //時間
  report += reports[i][1] + '/'; //内容
  report += reports[i][2] + '\n'; //進捗・気づき   
}

 シートから取得した2次元配列の要素は、各行のデータを格納した1次元配列になります。従って、2次元配列に存在している分のインデックスについてループすれば、各行をループしたことと同義になります。

 インデックスは0から始まりますが、0の要素は、見出し行になるので、ループの初期値は1になります。

 また、ループの条件は、最後のインデックスまでです。インデックスは0から始まるので、最後のインデックスは「(要素数-1)」になります。従って、ループの条件として言い換えると、「配列の要素数より小さい間」という条件になります。

 以上をまとめると、シートから取得した2次元配列を行単位でループする際の、for文を構成する各式は以下のようになります。

初期化式 var i = 1
条件式 i < reports.length
増減式 i++

 各行について、各項目は「/」でつなぎ、行の最後は「\n」で改行を連結します。このようにして、レポート部分のデータを一つの文字列として構成します。

メッセージの下書き作成に必要なデータを取得・生成する

 下記の部分は、「フォーマット」シートのデータをいったん2次元配列に格納した上で、メッセージの下書きを作るのに必要となる、送信先アドレス、メッセージ件名、本文を生成する部分です。

var values = ss.getSheetByName('フォーマット').getDataRange().getValues();
var to = values[1][1];
var subject = values[2][1];
var body = '';
body += values[3][1] + '\n\n';
body += report + '\n';
body += values[4][1];

メッセージの下書きを作成する

 GASではGmailを操作するサービスとして「Gmailサービス」が用意されています。Gmailサービスの機能を活用することで、メッセージの送信や下書きの作成、スレッドの検索や取得などが行えます。

 その機能にアクセスするための入り口となるグローバルオブジェクトが、「GmailApp」です。GmailAppオブジェクトの「createDraft()」メソッドを使うことで、Gmailにメッセージの下書きを作成できます。

GmailApp.createDraft(宛先, 件名, 本文)

 宛先、件名、本文はいずれも文字列で指定します。今回の場合は、前述の変数to、subject、bodyをそれぞれ挿入します。

スクリプト全体を確認

 解説は以上です。再度、関数「createDraft()」の内容を確認しましょう。

function createDraft() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var reports = ss.getSheetByName('レポート').getDataRange().getValues();
  var report = '';
  for(var i = 1; i < reports.length; i++){
    report += reports[i][0] + '/'; //時間
    report += reports[i][1] + '/'; //内容
    report += reports[i][2] + '\n'; //進捗・気づき   
  }
    
  var values = ss.getSheetByName('フォーマット').getDataRange().getValues();
  var to = values[1][1];
  var subject = values[2][1];
  var body = '';
  body += values[3][1] + '\n\n';
  body += report + '\n';
  body += values[4][1];
  
  GmailApp.createDraft(to, subject, body);
}

 今回は、GASで日報メールの下書きを作成するスクリプトを紹介しました。時限式のトリガーを活用すれば、スクリプトの実行自体も自動化できますので、ぜひ活用してみてください。

著者プロフィール

高橋宣成

プランノーツ 代表取締役

「ITを活用して日本の『働く』の価値を高める」をテーマに、ExcelやVBA、G Suite、Google Apps Script、クラウドなどによる企業または個人事業主向けのシステムおよびツールの開発やコンサルティング、セミナー講師などを務める。「IT×働き方」をテーマに運営するブログ「いつも隣にITのお仕事」は月間60万PV達成。

書籍紹介

ExcelVBAを実務で使い倒す技術

高橋宣成著 秀和システム 1800円(税別)

動くコードが書けたその先、つまり「ExcelVBAを実務で使う」という目的に特化した実践書。ExcelVBAを楽に効果的に使いこなし続けるための知恵と知識、そしてそのためのビジョンと踏み出す勇気を提供する1冊。


詳解! Google Apps Script完全入門 〜Google Apps & G Suiteの最新プログラミングガイド〜

高橋宣成著 秀和システム 2600円(税別)

Google Apps Scriptの完全入門書として、JavaScriptの基本から自作ライブラリまでを徹底解説。これ一冊だけで基礎から実践まで体系的にマスターできます。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。