【问题标题】:How to trigger a conditional email when a new Google Sheet row is added via Google Forms通过 Google 表单添加新的 Google 表格行时如何触发条件电子邮件
【发布时间】:2022-01-09 18:31:24
【问题描述】:

我正在通过 Google 表单收集请求,它们存储在 Google 表格中。所以每当有新的提交时,我想根据选择发送一封电子邮件。

目前我已经创建了一个单独的选项卡,其中存在电子邮件的国家和收件人。

在我的表单响应标签中,我写了一个公式:

=query(ArrayFormula(iferror(vlookup(B2:B;Sayfa2!$A$2:$B$4; 2; false))); "where Col1 <>''")

看起来像:

所以当有新的提交时提取数据。但是,我的 GAS 不会触发电子邮件


//setup function

var ActiveSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

if (ActiveSheet.getName() == 'Form Yanıtları 1') {

 var StartRow = 2;

 var RowRange = ActiveSheet.getLastRow() - StartRow + 1;

 var WholeRange = ActiveSheet.getRange(StartRow,1,RowRange,4);

 var AllValues = WholeRange.getValues();
 
   
 var message = ""

  //iterate loop

 for (i in AllValues) {

   //set current row

   var CurrentRow = AllValues[i];
   var row = AllValues[i]
   var alertRecipient = row[3];
   var emailMessage= row[2];
   var emailSubject = "A suggestion received for your style guide"

     //set HTML template for information

     message +=


         "<p><b>Option: </b>" + CurrentRow[1] + "</p>" +

           "<p><b>Comment: </b>" + CurrentRow[2] + "</p>" +

             "<p><b>Recipient: </b>" + CurrentRow[3] + "</p>" +
                      "</p><br><br>";


   }

 }//For loop close

 //define who to send emails to

 // var SendTo = "myemail@email.com";

 //set subject line

 // var Subject = "New Form";

 //send the actual email   if message is not empty

 if (message) {

   MailApp.sendEmail(alertRecipient,emailSubject,emailMessage);

 }//if message

}//if sheetName Review
//End Func

我将 GAS 触发器设置为 onEdit。

你能帮我理解我在哪里做错了吗?

非常感谢您的建议!

【问题讨论】:

  • 使用“onFormSubmit”触发器。 See here

标签: google-apps-script google-sheets


【解决方案1】:

试试这个,启动一次 myTriggerSetup

const adresseEmail = 'xxxxxxxxxxx@orange.fr'
const sujet = 'New form ...'

function myTriggerSetup() {
  if(!isTrigger('onFormSubmit')) {
    ScriptApp.newTrigger('onFormSubmit')
      .forSpreadsheet(SpreadsheetApp.getActive())
      .onFormSubmit()
      .create();
  }
}
function isTrigger(funcName) {
     var r=false;
     if(funcName) {
       var allTriggers=ScriptApp.getProjectTriggers();
       var allHandlers=[];
       for(var i=0;i<allTriggers.length;i++) {
         allHandlers.push(allTriggers[i].getHandlerFunction());
       }
       if(allHandlers.indexOf(funcName)>-1) {
         r=true;
       }
     }
     return r;
}

function onFormSubmit(e) {
  var responses = e.namedValues;
  getData(eval(responses))
  MailApp.sendEmail({
    to: adresseEmail,
    subject: sujet,
    htmlBody: '<table>' + result + '</table>', 
  });
  var d = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd MMM yyyy hh:mm a");
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = sheet.getActiveRange().getRow();
  var column = e.values.length + 1;
  sheet.getRange(row, column).setValue('Envoyé : ' + d);
}

let result = ''
function getData(obj) {
  for (let p in obj) {
    if (obj[p]!=null){
      if (typeof obj[p] != 'object' && typeof obj[p] != 'function'){
        result += '<tr><td>'+ obj[p] + '</td></tr>';
      }
      if (typeof obj[p] == 'object') {
        if (obj[p].length){
          result += '<tr><td><b>'+ p + ' :</b></td></tr>';
        }
        getData(obj[p]);
      }
    }
  }
}

【讨论】:

  • 午餐与发布会?
  • 好吧,对不起,我是法国人!!通过脚本接口执行以放置 onformsubmit 触发器
【解决方案2】:

出于文档目的发布此内容,JPV 在评论中提供了解决方案。

问题:

  • 用户手动更改电子表格中的值时,会触发onEdit 触发器。导致向工作表中添加新行的表单提交不会触发此触发器。
  • 简单的onEdit 触发器无法执行发送电子邮件等操作,因为这需要授权,简单的触发器无法访问需要授权的服务(请参阅Restrictions)。

解决办法:

  • 改为安装onFormSubmit 触发器,该触发器将在提交表单时触发。这可以安装for your formfor the spreadsheet,提交数据将被发送到。您可以安装它manuallyprogrammatically
  • 不要使用SpreadsheetApp 方法来获取表单响应数据,而是使用Event object,其中还包含提交数据(如果您安装电子表格触发器,these 是对象字段,these 是那些如果您在表单中安装它)。

【讨论】:

    【解决方案3】:

    感谢您的贡献。我找到了一个更简单的解决方案并想分享:

        function sendEmailv3() { 
         var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses Sheet'); 
         var emailAddress = sheet.getRange(sheet.getLastRow(),4).getValue();
         var message = sheet.getRange(sheet.getLastRow(),3).getValue();
    
    
         MailApp.sendEmail(emailAddress, "SubjectLine", message,{noReply:true});
      }
    

    希望对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多