Как запустить функцию на стороне сервера при отправке формы html - PullRequest
0 голосов
/ 23 января 2020

Я создал форму html, чтобы пользователи могли отправлять свои электронные письма на вкладку электронной почты "Emails"

В электронной таблице я создал еще одну вкладку "Sort Emails", чтобы отсортировать результаты вкладки "Emails" в обратный порядок, поэтому, пока люди отправляют свои электронные письма, у меня есть новое отправленное электронное письмо в Sort Emails B2.

Проблема заключается в следующем: теперь я пытаюсь автоматически отправить электронное письмо на новое отправленное электронное письмо при отправке, т.е. один раз новый пользователь отправляет форму, скрипт отправляет электронное письмо на адрес электронной почты пользователя, который должен находиться в Sort Emails B2. Любая помощь, пожалуйста. Заранее спасибо!

Обратите внимание, что когда я запускаю функцию SendEmail вручную из редактора скриптов листа, она работает, но мой вопрос касается автоматического запуска функции при отправке формы

Я не очень опытный, но я думаю, что нам нужен триггер для автоматического запуска функции SendEmail всякий раз, когда на лист добавляется новая строка, и, конечно, я пробовал триггеры текущего проекта в редакторе сценариев (оба onEdit и onChange) но не повезло (я не понимаю почему ??)

Это мой html файл:

<!DOCTYPE html>
<html lang="en">
<body>

<form name="Subscribe" id="Subscribe" action="https://script.google.com/macros/s/ScriptKey/exec" method="POST" onsubmit="myFunction()">
Form Inputs ..
</form>

<script>
function myFunction() {
  google.script.run.SendEmail();
}
</script>

</body>
</html>

И это мой файл GS:

function doGet() {
    return HtmlService.createTemplateFromFile('Form.html')
        .evaluate() // evaluate MUST come before setting the Sandbox mode
        .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

var sheetName = 'Emails'
var scriptProp = PropertiesService.getScriptProperties()


function doPost (e) {
  var lock = LockService.getScriptLock()
  lock.tryLock(10000)

  try {
    var doc = SpreadsheetApp.getActive();
    var sheet = doc.getSheetByName(sheetName)

    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
    var nextRow = sheet.getLastRow() + 1

    var newRow = headers.map(function(header) {
      return header === 'Timestamp' ? new Date() : e.parameter[header]
    })

    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
    var y = sheet.getLastRow();
    var x = sheet.getRange(y,2).getValues();

    return ContentService
      .createTextOutput(JSON.stringify({ 'Central Says': 'Successfully subscribed', 'Email': x }))
      .setMimeType(ContentService.MimeType.JSON)
  }

  catch (e) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
      .setMimeType(ContentService.MimeType.JSON)
  }

  finally {
    lock.releaseLock()
  }
}

function SendEmail() {
var e = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sort Emails").getRange("B2").getValues();
var m = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Template").getRange("A1").getValues();
var subject = 'Welcome ..';
MailApp.sendEmail(e, subject, m);
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Сначала вы должны изменить getActiveSpreadsheet() на openById("SPREADSHEET ID"), а затем у вас есть два варианта:

Вы сохраняете функцию SendEmail():

function SendEmail() {
  var e = SpreadsheetApp.openById("SPREADSHEET ID").getSheetByName("Sort Emails").getRange("B2").getValue();
  var m = SpreadsheetApp.openById("SPREADSHEET ID").getSheetByName("Template").getRange("A1").getValue();
  var subject = 'Welcome ..';
  MailApp.sendEmail(e, subject, m);
}

Или делаете все внутри doPost и удалите вызов функции SendEmail() в HTML:

function doPost (e) {
  var lock = LockService.getScriptLock()
  lock.tryLock(10000)

  try {

    var e = SpreadsheetApp.openById("SPREADSHEET ID").getSheetByName("Sort Emails").getRange("B2").getValue();
    var m = SpreadsheetApp.openById("SPREADSHEET ID").getSheetByName("Template").getRange("A1").getValue();
    var subject = 'Welcome ..';
    MailApp.sendEmail(e, subject, m);

    var doc = SpreadsheetApp.getActive();
    var sheet = doc.getSheetByName(sheetName)

    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
    var nextRow = sheet.getLastRow() + 1

    var newRow = headers.map(function(header) {
      return header === 'Timestamp' ? new Date() : e.parameter[header]
    })

    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
    var y = sheet.getLastRow();
    var x = sheet.getRange(y,2).getValues();

    return ContentService
    .createTextOutput(JSON.stringify({ 'Central Says': 'Successfully subscribed', 'Email' : x}))
    .setMimeType(ContentService.MimeType.JSON)  
  }
  catch (e) {
    return ContentService
    .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
    .setMimeType(ContentService.MimeType.JSON)
  }

  finally {
    lock.releaseLock()
  }
}
0 голосов
/ 23 января 2020

Правильный способ сделать это - сделать запрос к серверному приложению, которое вы должны создать для обработки этого серверного содержимого, API. Вы можете очень легко создать этот API для работы с такими фреймворками, как Express. js или Koa. js

Тогда на стороне сервера вы будете обрабатывать как это:

... // Initializing stuffs
app.post('/sendEmail/:email', function(req, res, next) {
    const userEmail = req.params.email;
    try {
        google.script.run.SendEmail(userEmail);
        res.json({ message: 'success' });
    } catch (err) {
        res
          .status(400)
          .json({ message: 'failure' + err.message })
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...