やったこと
目安箱シートに溜められた投稿の投稿日を見て、先月の件数をカウントしてメールを送るGASを書いた。
前提
Googleフォームから投稿した内容をスプレッドシートに溜めるようにしている。
シートには下記の内容が溜められる。
タイムスタンプが入力されたセルの値をスクリプトからgetValue()
で参照しようとするとTue Feb 22 07:13:43 GMT-05:00 2022
の形になっていた。
これを変えるのは奔走しそうだとおもったので英語表記の月のママ使った。
先月を英語表記で取得する関数
下記記事のものをコピペさせていただいた。
https://qiita.com/yu-smc/items/8bdde9ff6729ce848c09
function get_english_month() {
const month_english_list = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
//月の英語表記を配列に定義。
var date = new Date()
//Dateオブジェクトで日付を取得(引数を持たせなければ現在時刻を取得する)
var last_month = date.getMonth()-1;
//dateから月を取り出してmonthに代入
var month_english = month_english_list[last_month];
//month_english-listのmonth番目の要素をmonth_englishに代入。 ※getMonth()は0-11までの整数が返る(1月は0になる)ので、[month-1]とする必要はない
return month_english
}
記事のスクリプトから微調整したこと
- 取得月を先月に変更
- 英語表記を3文字に統一
- 関数として呼びだすために戻り値を設定
先月の投稿が何件あったかカウント
function myFunction() {
//現在のスプレッドシートを取得
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
//現在のシートを取得
var sheet = spreadsheet.getSheetByName("Answer");
//最終行取得
var lastRow = sheet.getLastRow()
var last_month = get_english_month();
var j = 0;
for(var i = 1; i <= lastRow; i++){
var range = sheet.getRange(i,1);
var value = range.getValue();
var month = String(value).substr(4,3);
if(last_month === month){
j++;
}
}
sendMail(j);
}
セルの値のタイムスタンプの英語表記の月をsubstrで取得しようとするとsubstr関数が使えないエラーに。
String(Value).substr(4,3)
とすることで取得できた。
セルの値対して使う場合、文字列だとString()で明示しないとsubstr関数が使えないのか?
メール送信
function sendMail(j){
var recipient = "メールアドレス";
if(j > 0){
var subject = "意見交換会開催のお知らせ";
}else{
var subject = "意見交換会は開催されません";
}
var d = new Date();
var y = d.getFullYear();
var mon = d.getMonth() + 1;
var body = mon + "月の目安箱への投稿は" + j + "件でした";
GmailApp.sendEmail(recipient, subject, body);
}
最後にGASのトリガーの発火日付を毎月1日に設定すれば完成。