Google sheets script to email when form response received

微笑、不失礼 提交于 2019-12-24 07:17:47

问题


I have a sheet https://docs.google.com/spreadsheets/d/1NcCZ5Y7YrL63e2i6osQC28MOG3_Mq4fLPUANFrxxYNE/edit#gid=725463476 with multiple forms feeding it. I need a script that when a new response is received it will pull the data from a different sheet and email it. I will need a script that I can modify for each different form response. So if possible have a sheet to watch and sheet where the data is pulled form called out in the script so I can just change the sheet name in the script for each different one. I have about 7 or 8 of these in my real sheet. I will also need some html probably in it? Maybe it can pull the colors/size/bold ect from the sheet? If not I will need to know how to add font size/color/bold and even trickier if it cant pull this from the sheet I will need conditional colors based on the words pass and fail. Green for pass and red for fail. I will be in and out of the sheet fell free to leave notes on the sheet ect. It's just a sample so type away. Hope to chat in the sheet with someone who can help me out!

Thank you! Stephen


回答1:


Sending Emails from Google Forms Submit

This is a menu that you can use to create your trigger it only allows you to create one trigger at a time.

function coopermenu() {
  SpreadsheetApp.getUi().createMenu('Cooper Menu')
  .addItem('Create Trigger', 'createFormSubmitTrigger')
  .addToUi();
}

This will setup your trigger

function createFormSubmitTrigger(funcname) {
  var funcname=funcname||'form1Submit';
  if(!isTrigger(funcname)) {
    ScriptApp.newTrigger(funcname).forSpreadsheet(SpreadsheetApp.getActive()).onFormSubmit().create();
  }
}

And this is the function that the trigger runs along with your upgrade requests:

function form1Submit(e) {
  Logger.log(JSON.stringify(e));
  Logger.log('Sheet: %s',e.range.getSheet().getName());
  var sheetname=e.range.getSheet().getName();
  switch(sheetname) {
    case 'Form Responses 1':
      if(e.values && e.values[1] && e.values[2]) {
        var html='<table>';
        html+=Utilities.formatString('<tr><td>%s</td><td colspan="2">%s</td></tr>','To:',getGlobal('form1Email'));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;','&nbsp;','&nbsp;' );//empty line
        html+=Utilities.formatString('<tr><td>%s</td><td colspan="2">%s</td></tr>','Subject:',getGlobal('form1Subject'));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;','&nbsp;','&nbsp;' );//empty line
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td><strong>%s</strong></td></tr>','&nbsp;','TimeStamp:',e.values[0]);
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td><strong>%s</strong></td></tr>','&nbsp;','Location:',e.values[1]);
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td><strong>%s</strong></td></tr>','&nbsp;','Name:',e.values[2]);
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;',RoGpf(e.values[3]),RoG(e.values[3]));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;',RoGpf(e.values[4]),RoG(e.values[4]));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;',RoGpf(e.values[5]),RoG(e.values[5]));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;',RoGpf(e.values[6]),RoG(e.values[6]));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;',RoGpf(e.values[7]),RoG(e.values[7]));
        html+='</table>';
        Logger.log(html);
        GmailApp.sendEmail(getGlobal('form1Email'), getGlobal('form1Subject'), '', {htmlBody:html});
      }
      break;
    case 'Form Responses 2':  
      if(e.values && e.values[1] && e.values[2]) {
        var html='<table>';
        html+=Utilities.formatString('<tr><td>%s</td><td colspan="2">%s</td></tr>','To:',getGlobal('form2Email'));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;','&nbsp;','&nbsp;' );//empty line
        html+=Utilities.formatString('<tr><td>%s</td><td colspan="2">%s</td></tr>','Subject:',getGlobal('form2Subject'));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;','&nbsp;','&nbsp;' );//empty line
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td><strong>%s</strong></td></tr>','&nbsp;','TimeStamp:',e.values[1]);
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td><strong>%s</strong></td></tr>','&nbsp;','Location:',e.values[0]);
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td><strong>%s</strong></td></tr>','&nbsp;','Name:',e.values[2]);
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;',RoGpf(e.values[3]),RoG(e.values[3]));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;',RoGpf(e.values[5]),RoG(e.values[5]));
        html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>','&nbsp;',RoGpf(e.values[6]),RoG(e.values[6]));
        html+='</table>';
        Logger.log(html);
        GmailApp.sendEmail(getGlobal('form2Email'), getGlobal('form2Subject'), '', {htmlBody:html});
      }
      break;
  }   
}

function RoG(s) {
  if(s) {
    if(s=='Pass') {
      return '<span style="color:#00ff00;font-weight:bold">Pass</span';
    }else if(s=='Fail') {
      return '<span style="color:#ff0000;font-weight:bold">Fail</span>';
    }
  }
  return s;
}

function RoGpf(s) {
  if(s) {
    if(s=='Pass') {
      return '<span style="color:#00ff00;font-weight:bold">Pass/Fail</span';
    }else if(s=='Fail') {
      return '<span style="color:#ff0000;font-weight:bold">Pass/Fail</span>';
    }
  }
  return s;
}

These are some utilities that I used:

triggers.gs:

//Filename: triggers.gs
function deleteTrigger(triggerName){
  var triggers=ScriptApp.getProjectTriggers();
  for (var i=0;i<triggers.length;i++){
    if (triggerName==triggers[i].getHandlerFunction()){
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

function isTrigger(funcName){
  var r=false;
  if(funcName){
    var allTriggers=ScriptApp.getProjectTriggers();
    for(var i=0;i<allTriggers.length;i++){
      if(funcName==allTriggers[i].getHandlerFunction()){
        r=true;
        break;
      }
    }
  }
  return r;
}

function deleteAllTriggers(){
  var triggers=ScriptApp.getProjectTriggers();
  for (var i=0;i<triggers.length; i++){
    ScriptApp.deleteTrigger(triggers[i]);
  }
}

function showMeProjectTriggers(){
  var html='';
  var br='<br />';
  var triggers=ScriptApp.getProjectTriggers();
  for(var i=0;i<triggers.length;i++){
    var name=triggers[i].getHandlerFunction();
    html+=br + 'triggers[' + i + '] = ' + name;
  }
  html+=br + '<input type="button" value="Close" onClick="google.script.host.close();" />';
  var userInterface=HtmlService.createHtmlOutput(html).setWidth(800).setHeight(450);
  SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Project Handler Functions');
}

globals.gs

function getGlobals(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Globals');
  var rg=sh.getRange(1,1,sh.getLastRow(),2);
  var vA=rg.getValues();
  var g={};
  for(var i=0;i<vA.length;i++){
    g[vA[i][0]]=vA[i][1];
  }
  return g;
}

function setGlobals(dfltObj){
  var dfltH=Object.keys(dfltObj).length;
  if(dfltObj){
    var ss=SpreadsheetApp.getActive();
    var sh=ss.getSheetByName('Globals');
    var rg=sh.getRange(1,1,dfltH,2);
    var vA=rg.getValues();
    for(var i=0;i<dfltH;i++){
      vA[i][1]=dfltObj[vA[i][0]];
    }
    rg.setValues(vA);
  }
}

function getGlobal(name){
  return getGlobals()[name];
}

function setGlobal(name,value){
  var curObj=getGlobals();
  if(!curObj.hasOwnProperty(name)) {
    var ss=SpreadsheetApp.getActive();
    var sh=ss.getSheetByName('Globals');
    sh.appendRow([name,value])
  }else{
    curObj[name]=value;
    setGlobals(curObj);
  }
}

function cleanGlobals() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Globals');
  if(sh.getLastColumn()>2) {
    sh.getRange(1,3,sh.getLastRow(),sh.getLastColumn()-2).clearContent();
  }
  var rg=sh.getRange(1,1,sh.getLastRow(),2);
  var vA=rg.getValues();
  for(var i=0;i<vA.length;i++) {
    if(!vA[i][0] || !vA[i][1]) {
      var userInterface=HtmlService.createHtmlOutput('Globals Sheet Requires Maintenance...Do it know.' + ' Check Row ' + Number(i + 1));
      SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Global Maintenance Required');
      break;
    }
  }
}
  • Trigger Builder
  • Form Event Object

Instructions

  1. Create globals.gs and paste globals script.
  2. Create triggers.gs and paste triggers scripts.
  3. Create cooper.gs and paste in the other scripts. I did this because other people were getting into code and they just deleted my scripts and over wrote theirs. Not very kind in my mind.
  4. Create a Globals Sheet. A1='form1Subject', A2='form1Email', B1='Your Subject', and B2='Your email'.
  5. The go into the script editor and run coopermenu() and this will give your a permissions dialog. You need to authorize inorder to run the script. It figures out all of the scopes for you.
  6. Then go to the new menu and press create trigger. It will allow you to create only one at a time.
  7. Go to the live form and fill one out
  8. Read your email it will look something like this image below.
  9. Since we have been having problems with spurious formSubmits I used the follow logic to prevent them if(e.values && e.values[1] && e.values[2]) { this means that your Name and Location question must be filled in in order to receive an email.

I made the spacing changes you requested and here's what the emails look like now.



来源:https://stackoverflow.com/questions/55711352/google-sheets-script-to-email-when-form-response-received

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!