Query関数で引っ張ったほうがサクッといくことがあります。
今回はQuery関数を使って、前から作っておきたかった簡単なメール送信予約シートを作りました。
今までChromeの拡張を使ったりしてたのですが、有料ですとかフリーミアムモデルで途中から有料ですとか言われたものの、そんなものSpreadsheetで作れるのに有料とかいい商売してるなーと感じてました。
Spreadsheetに簡単なフォームを生成して、あとは1分おきとか5分おきにScriptを回しておくだけ。
1時間くらいで作ったというのもあって、変数定義の部分の変更くらいはいれようかなぁ。
ま、こんなスクリプトを書いてみました。var sheetNumber = 1
function sendEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[sheetNumber - 1];
var now = new Date();
var nDate = now.getYear() + "/" + parseInt(now.getMonth() + 1) + "/" + now.getDate();
var nTime = now.getHours() + ":" + now.getMinutes() + ":00";
sheet.getRange("J1").setValue(nDate);
sheet.getRange("K1").setValue(nTime);
sheet.getRange("A1").setFormula('QUERY(\'Form Responses 1\'!A:F;\"select * where E = date \"&text(J1,"\'\'YYYY-MM-DD\'\'\")&\" and F = timeofday \'\"&K1&\"\'\")');
var rows = sheet.getLastRow();
var dataCount = rows - 1;
var emailAddress,subject,message,dataCount2;
if(dataCount > 0){
for(var i = 0 ; i < rows-1 ; i++){
emailAddress = sheet.getRange(i+2,2).getValue();
subject = sheet.getRange(i+2,3).getValue();
message = sheet.getRange(i+2,4).getValue();
MailApp.sendEmail(emailAddress, subject, message);
}
var latestDate = sheet.getRange(rows,5).getValue();
var latestTime = sheet.getRange(rows,6).getValue();
sheet.getRange("M1").setValue(latestDate);
sheet.getRange("N1").setValue(latestTime);
sheet.getRange("A1").setFormula('QUERY(\'Form Responses 1\'!A:F;\"select * where E = date \"&text(J1,"\'\'YYYY-MM-DD\'\'\")&\" and F > timeofday \'\"&K1&\"\'\")');
rows = sheet.getLastRow();
dataCount = rows - 1;
sheet.getRange("A1").setFormula('QUERY(\'Form Responses 1\'!A:F;\"select * where E > date \"&text(J1,"\'\'YYYY-MM-DD\'\'\"))');
rows = sheet.getLastRow();
dataCount2 = rows - 1;
if(dataCount == 0 && dataCount2 == 0){
DeleteSheet();
}
}
}
function DeleteSheet() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[sheetNumber];
var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();
var values = datarange.getValues();
for (i=lastrow;i>=2;i--) {
var tempdate = values[i-1][2];
{
sheet.deleteRow(i);
function deleteAllResponses() {}
}
}
}
function deleteAllResponses() {
var form, urlForm = SpreadsheetApp.getActiveSpreadsheet().getFormUrl();
if (urlForm) {
form = FormApp.openByUrl(urlForm);
if (form) form.deleteAllResponses();
}
}
追記1)シートが重くならないように一定条件でデータを削除するフローを追加と、それに伴う一部ソースを修正しました。

0 コメント:
コメントを投稿