Электронное письмо не отправляется или, возможно, не запускается в форме отправки скриптов Google Apps

#google-apps-script

#google-apps-script

Вопрос:

Ну, у нас есть эта форма Google, и подробности добавляются в Google Sheet с помощью пользовательских скриптов g apps. Когда данные будут добавлены в журнал Google Sheet, он должен отправить электронное письмо. Если я запускаю sendmail() вручную, он работает, но когда я вызываю его внутри onFormSubmit(), он не работает. Что могло пойти не так?

 function onFormSubmit(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var templateLink = sheet.getSheetByName("Template Link").getRange(1, 1).getValue();
  var logSheet = sheet.getSheetByName("Log");
  var formResponsesSheet = sheet.getSheetByName("Form Responses 1");
  var formResponsesHeader = formResponsesSheet.getRange(1, 2, 1, formResponsesSheet.getLastColumn() -1).getValues();
  
  var newFileName = e.namedValues['Name'][0]   "-"   e.namedValues['Date'][0];
  
  var populatedDocsFolder = DriveApp.getFolderById("1yTSd7W0U4Gcsm6CIw8NtD022F-MA7CPx");
  var templateDocID = DocumentApp.openByUrl(templateLink).getId();
  var newDocID = DriveApp.getFileById(templateDocID).makeCopy(newFileName, populatedDocsFolder).getId();
  var newDocLink = DriveApp.getFileById(newDocID).getUrl();
  var newDoc = DocumentApp.openById(newDocID);
  var newDocBody = newDoc.getBody();
  for (i = 0; i < formResponsesHeader[0].length; i  ) {
    var thisHeader = formResponsesHeader[0][i];
    var thisValue = e.namedValues[thisHeader][0];
    newDocBody.replaceText("<<"   thisHeader   ">>", thisValue);
  } 
  
  //Log
  var name = e.namedValues['Name'][0];
  var email = e.namedValues['Email'][0];
  var date = e.namedValues['Date'][0];
  logSheet.appendRow([name,email,date,newDocID]);
  
  //Trigger
  ScriptApp.newTrigger("sendEmail").timeBased().after(15000).create();
  
  //sendEmail();
}

function sendEmail() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var logSheet = sheet.getSheetByName("Log");
  var logSheetData = logSheet.getDataRange().getDisplayValues();
  var templateName = sheet.getSheetByName("Template Name").getRange(1, 1).getValue();
  
  for (i = 1; i < logSheetData.length; i  ) {
    if (logSheetData[i][4] == "") {
      //SEND EMAIL
      var name = logSheetData[i][0];
      var email = logSheetData[i][1];
      var date = logSheetData[i][2];
      var id = logSheetData[i][3];
      
      var pdfName = templateName   "-"   name   "-"   date;
      
      //PDF EMAIL 
      try{
        var doc = DriveApp.getFileById(id);
        var blob = doc.getBlob().getAs('application/pdf').setName(pdfName   ".pdf");
        var subject = 'Document Created';
        //GmailApp.sendEmail(email, subject, "This is just a test", {attachments: [blob]});
        MailApp.sendEmail(email, subject, "", {attachments: [blob], name: pdfName});
      }catch(err){
       continue;
      }
        
      //Log Sheet Update
      logSheet.getRange(i   1, 5).setValue("Sent");
    }
  }
}

function onOpen() {
  SpreadsheetApp.getUi().createMenu("Custom Menu")
  .addItem("Build Form Submit Trigger", "formSubmitTrigger")
  .addSeparator()
  .addItem("Send Email", "sendEmail")
  .addSeparator()
  .addItem("Mismatch Check", "mismatchCheck")
  .addToUi(); 
}

function formSubmitTrigger() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger("onFormSubmit").forSpreadsheet(sheet).onFormSubmit().create();
}

function mismatchCheck() {
  var result = "";
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var templateLink = sheet.getSheetByName("Template Link").getRange(1, 1).getValue();
  
  var formResponsesSheet = sheet.getSheetByName("Form Responses 1");
  var formResponsesHeader = formResponsesSheet.getRange(1, 2, 1, formResponsesSheet.getLastColumn() -1).getValues();
  
  var docBody = DocumentApp.openByUrl(templateLink).getBody().getText();
  var matches = docBody.match(/<</g); var noOfLessThanMatches = matches.length;
  var matches = docBody.match(/>>/g); var noOfMoreThanMatches = matches.length;
  var lessThan = docBody.search(/<</g);
  var moreThan = docBody.search(/>>/g);
  Logger.log([noOfLessThanMatches,noOfMoreThanMatches]); 
  
  result  = "<b>Less Than Signs:</b> "   noOfLessThanMatches   "<br>";
  result  = "<b>More Than Signs:</b> "   noOfMoreThanMatches   "<br>";
  result  = "<br><b>Doc to Form Check</b><br>";
  
  var newDocBody = docBody;
  var reverseArray = [];
  
  for (i = 0; i < noOfLessThanMatches; i  ) {
    var lessThan = newDocBody.search(/<</g);
    var moreThan = newDocBody.search(/>>/g);
    var subString = newDocBody.substring(lessThan   2,moreThan);
    Logger.log(subString);
    var indexOf = formResponsesHeader[0].indexOf(subString);
    if (indexOf > -1) {
      result  = subString   " - FOUND<br>";
    } else {
      result  = subString   " - NOT FOUND<br>";
    }
    reverseArray.push(subString);
    newDocBody = newDocBody.replace("<<"   subString   ">>","XX")
  }
  
  result  = "<br><b>Form to Doc Check</b><br>";
  for (z = 0; z < formResponsesHeader[0].length; z  ) {
    var thisString = formResponsesHeader[0][z];
    var indexOf = reverseArray.indexOf(thisString);
    if (indexOf > -1) {
      result  = thisString   " - FOUND<br>";
    } else {
      result  = thisString   " - NOT FOUND<br>";
    }    
  }
  Logger.log(result);
  
  var htmlOutput = HtmlService
  .createHtmlOutput('<p>'    result   '</p>')
  .setWidth(400)
  .setHeight(500);
  
  SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'RESULT');  
}

  

ОБНОВЛЕНИЕ: вместо этого я вставил весь код выше, чтобы вы, ребята, могли видеть

Комментарии:

1. Можете ли вы показать код, в котором вы вызываете эту функцию из onFormSubmit() триггера?

2. привет, да, здесь function formSubmitTrigger() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); ScriptApp.newTrigger("onFormSubmit").forSpreadsheet(sheet).onFormSubmit().create(); }

Ответ №1:

Вы должны зарегистрировать onFormSubmit в качестве функции, которая обрабатывает триггер отправки формы. Вы зарегистрировали функцию «onFormSubmit» следующим образом:

 ScriptApp.newTrigger('onFormSubmit').forForm(form).onFormSubmit().create();
  

Вы также можете проверить зарегистрированные триггеры, нажав «Правка»> «Триггер текущего проекта» в вашем проекте Apps Script.

[Редактировать] Поскольку триггер создан правильно, измените первую строку кода триггера с:

 function onFormSubmit(e) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  

к этому:

 function onFormSubmit(e) {
  var sheet = SpreadsheetApp.openById(e.source.getDestinationId());
  

Комментарии:

1. Да, у меня есть этот код « function formSubmitTrigger() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); ScriptApp.newTrigger(«onFormSubmit»).forSpreadsheet(лист). onFormSubmit().create(); } «

2. В этом случае, вероятно, происходит сбой в первой строке в onFormSubmit: var sheet = SpreadsheetApp.getActiveSpreadsheet(); Вы должны получить доступ к электронной таблице или форме через событие (например, например, form), а не через SpreadsheetApp.getActiveSpreadsheet(), который будет работать только для владельца скриптау кого открыта эта электронная таблица.

3. Переместите SendEmail() в первую строку. Или получите лист из события: var sheet = SpreadsheetApp.openById(например,form.getDestinationId());