Скрипт Google листов для отправки по электронной почте при получении ответа - PullRequest
1 голос
/ 16 апреля 2019

У меня есть лист https://docs.google.com/spreadsheets/d/1NcCZ5Y7YrL63e2i6osQC28MOG3_Mq4fLPUANFrxxYNE/edit#gid=725463476 с несколькими формами подачи. Мне нужен скрипт, который при получении нового ответа извлекает данные с другого листа и отправляет их по электронной почте. Мне понадобится скрипт, который я могу изменить для каждого ответа формы. Поэтому, если возможно, есть лист для просмотра и лист, где данные извлекаются из сценария, чтобы я мог просто изменить имя листа в сценарии для каждого отдельного. У меня есть около 7 или 8 из них в моем реальном листе. Мне также понадобится HTML, вероятно, в нем? Может быть, он может вытащить цвета / размер / жирный текст с листа? Если нет, мне нужно будет знать, как добавить размер шрифта / цвет / полужирный и даже хитрее, если он не может извлечь это из листа, мне понадобятся условные цвета, основанные на словах «пропусти и проваливай». Зеленый для прохода и красный для неудачи. Я буду в и из листа выпал свободно, чтобы оставить заметки на листе и т. Д. Это просто образец, так что напечатайте. Надеюсь поболтать с кем-нибудь, кто может мне помочь!

Спасибо! Стивен

1 Ответ

0 голосов
/ 17 апреля 2019

Отправка писем из Google Forms Submit

Это меню, которое вы можете использовать для создания триггера, оно позволяет создавать только один триггер за раз.

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

Это установит ваш триггер

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

И эта функция запускается триггером вместе с вашими запросами на обновление:

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;
}

Вот некоторые утилиты, которые я использовал:

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;
    }
  }
}

Инструкция

  1. Создание сценария globals.gs и вставка глобалов.
  2. Создайте сценарии triggers.gs и вставьте сценарии запуска.
  3. Создайте cooper.gs и вставьте другие скрипты. Я сделал это, потому что другие люди были в коде, и они просто удалили мои сценарии и переписали их. Не очень добр в моем уме.
  4. Создать глобальный лист. A1 = 'form1Subject', A2 = 'form1Email', B1 = 'Ваша тема' и B2 = 'Ваша электронная почта'.
  5. Зайдите в редактор скриптов и запустите coopermenu (), и у вас появится диалоговое окно с разрешениями. Вы должны авторизовать inorder для запуска скрипта. Он рассчитывает все возможности для вас.
  6. Затем перейдите в новое меню и нажмите кнопку создания триггера. Это позволит вам создавать только по одному за раз.
  7. Перейти к живой форме и заполнить одну
  8. Прочитайте ваше письмо, оно будет выглядеть примерно так, как показано ниже.
  9. Так как у нас были проблемы с ложными формами отправки, я использовал следующую логику, чтобы предотвратить их if(e.values && e.values[1] && e.values[2]) { это означает, что ваш вопрос об имени и местонахождении должен быть заполнен для получения электронного письма.

enter image description here

Я внес изменения в интервалы, которые вы запрашивали, и вот как теперь выглядят электронные письма.

enter image description here

...