0

だから私はGoogle Docs SpreadsheetをフィードするGoogle Formを持っています。このフォームは、私たちの町に新しく来た人が、私たちの新人グループにサインアップするためのものです。

フォームを送信してから 10 日後に会費を支払っていないユーザーにリマインダー メールをプログラムで送信する Google Apps スクリプトを作成したいと考えています。

簡単なはずですよね?

個人データが削除されたスプレッドシートのコピーへのリンクは次のとおりです。

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 年まで機能するので、今のところ安全に使用できると思います ;-)

トリガーの問題は、コーネリアスの回答thxですでに解決されています

編集:ここにあなたが望むことをするための可能なコードがあります:(あなたのシートでテストされています)

 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つの関数に分割しましたが、トリガーとして実行する場合は、両方の関数を1つにまとめて自動チェックを行う必要があります...

于 2012-07-19T01:25:36.203 に答える
0

比較関数を作成するのは非常に簡単なはずです。あとは、独自の毎日のトリガーを追加するだけです。

スクリプト エディタで [Resources] -> [Triggers] を見てください。

これは、Google のトリガー チュートリアルへのリンクです。

于 2012-07-19T01:12:51.430 に答える