#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());