0

所以我有一个谷歌表单,它提供谷歌文档电子表格。此表格是为我们镇上的新人注册我们的新人组。

我想编写一个 Google Apps 脚本,该脚本将以编程方式向提交表单 10 天后仍未缴纳会费的用户发送提醒电子邮件。

应该很容易吧?

以下是电子表格副本的链接,其中个人数据已被删除:

https://docs.google.com/spreadsheet/ccc?key=0AjsoIob8dJfodG9WN0ZmWUE1ek9rc3JrVFpDQ0J0OGc

似乎我应该能够使用 A 列(“时间戳”)与 now() 进行某种比较来确定 10 天部分。并且要获得尚未支付的会费,必须是 D 列不等于是。显然,收件人的电子邮件地址在 X 列中。

我已经编写了一个脚本来向收件人“提交表单”发送一封确认电子邮件。所以我对 MailApp.sendEmail 类很满意。

如果您注意到“Updaid”选项卡,您会看到我已经使用查询来拉出尚未付款的人。

但我不确定如何让 MailApp.sendEmail 类对已经在工作表中的数据进行操作。提交表单时不会自动触发。

而且我不知道如何调整我的查询以解释 10 天前的内容。

而且我什至不确定我是否应该为此应用程序使用查询。

任何人都可以纠正我的道路吗?

谢谢。

4

2 回答 2

2

知道日期是否晚于 10 天的最简单方法可能是计算毫秒数!

我知道这听起来像个笑话,但事实并非如此;-)

例子 :

function test(){
var today = new Date();
var tendaysBefore = new Date(today.getTime()-10*24*60*60*1000);// 10 times 24 hours
Logger.log(today+' is 10 later than '+tendaysBefore);
}

getTime() 方法返回从参考日期开始的毫秒数,它将工作到 2070 年,所以我想现在可以安全使用 ;-)

科尼利厄斯的回答已经解决了触发问题,谢谢

编辑:这是一个可能的代码来做你想做的事:(在你的工作表上测试)

 var sh = SpreadsheetApp.getActiveSheet();
 var ss = SpreadsheetApp.getActiveSpreadsheet();// replace these with openbyId''ID') and getSheetByName(name) when you run it with trigger since the sheet wil be 'closed'
 var lastrow = ss.getLastRow();

function onOpen() {
  var menuEntries = [ {name: "check late paiments", functionName: "test"},
                      {name: "send mails to tagged users", functionName: "mailunpaid"},
                                     ];
  ss.addMenu("custom functions",menuEntries);// custom menu
  } 

function test(){ // check column D and set it to "no" if not paid
     var paidcol = sh.getRange(2, 4, lastrow-1, 1).getValues();//read only col D
     for(nn=0;nn<paidcol.length;++nn){
       if(paidcol[nn][0].toString().toLowerCase().match('yes')!='yes'){
       paidcol[nn][0]='no'
       }
       }
      sh.getRange(2, 4, lastrow-1, 1).setValues(paidcol);// write back to sheet
      }

function mailunpaid(){
     var data = sh.getDataRange().getValues();//read the whole sheet in an array, col D is idx3, timestamp is idx0 email is idx 23 
     var today = new Date();
     var tendaysBefore = new Date(today.getTime()-10*24*60*60*1000);// 10 times 24 hours
       for (nn=1;nn<data.length;++nn){  // iterate from row 2 to end ie idx 0 to last
    // Logger.log(data[nn][3]+'   '+data[nn][0])
         if(data[nn][0]<=tendaysBefore && data[nn][3]=='no'){
     //    MailApp.sendEmail(data[nn][23], 'subject', 'body'); // you have to define the mail subject & content somewhere ;-) and uncomment when finished your tests
     Logger.log('row '+Number(nn+1)+' = to send because '+data[nn][0])
         sh.getRange(nn+1,4).setValue('SENT');// tag this user to know that mail has been sent to avoid multiple emails
          }
       }
    }

请注意,为了清楚起见,我将代码拆分为 2 个函数,但是当它作为触发器运行时,您应该将这两个函数组合在一起以进行自动检查...

于 2012-07-19T01:25:36.203 回答
0

编写比较函数应该很容易,然后您只需要添加自己的每日触发器。

查看脚本编辑器中的 Resources-> Triggers。

这是来自 Google 的触发器教程的链接。

于 2012-07-19T01:12:51.430 回答