Форма Google отвечает проверкой на листе и отправляет электронное письмо пользователям на его основе - PullRequest
0 голосов
/ 12 февраля 2020

Технические данные Требование: -

Я пытаюсь написать скрипт Google App для отправки электронной почты на основе их ответов при отправке формы для командировочных расходов. т. е. если пользователи формы выбирают x в качестве своего города y, то в качестве сценария суточных (суточных) следует проверять приложенный лист Google на предварительно заданные значения, а если пользователь ввел значение, превышающее выделенное для города, он должен отправить электронное письмо администраторам по адресу рассмотрите запрос, иначе отправьте электронное письмо пользователям, которые одобрены автоматически.

Я знаю, что это можно сделать, если l oop, но довольно плохо знакомы с кодированием, пытающимся вытащить это условие, любая помощь будет отличной

function onformsubmit(e){   
  var townCity = e.values[11];
  var currency = e.values[12];
.... // other lines of function
}

function sendEmails(townCity,currency){//var imported for other function for validation
  var ss = SpreadsheetApp.openById("ssid");
  var sheet = ss.getSheetByName("Rates for validation check");
  var lastRow = sheet.getLastRow();
  var city= sheet.getRange(2, 2, 141); // Fetch the range, including the minimums column 2 for city list in data sheet
  var budget= sheet.getRange(2, 3, 141); // Fetch the range, including the minimums column 3 for allocated budget for each city in dat sheet
  var location = city.getValues(); // Fetch values for each row in the Range.
  var location2 = budget.getValues();
  Logger.log(townCity); // log test 
  if (townCity == location && currency == location2 ) {
    Logger.log('sendemail');}
  else if(townCity == location && currency != location2) {
    Logger.log('dontsendemail');
  } 
}

последняя форма листа

Полный код

// When Form Gets submitted
function onFormSubmit(e) {
//Get information from form and set as variables
var emailAddress = e.values[1];
var clientName = e.values[4];
var StartDate = e.values[6];
var EndDate = e.values[7];
var country = e.values[9];
var townCity = e.values[8];//this value here is not been picked correctly as the contents in the column were retried by formula from all the other city columns
var amount = e.values[12];
var currency = e.values[11];
var engagementLeaderName = e.values[2];
//Logger.log('Lets see if its here'+ townCity);
}
  //funtion to validate with data sheet
function sendEmails(amount,townCity){
  var ss = SpreadsheetApp.openById("ssid");
  var sheet = ss.getSheetByName("Rates for validation check");
  var firstRow = 2;
  var firstCol = 2;
  var numRows = sheet.getLastRow() - firstRow + 1;
  var numCols = 2;
  var allocated = sheet.getRange(firstRow, firstCol, numRows, numCols).getValues();
  var index = allocated.map(function(value) {
    return value[0];
  }).indexOf(townCity);
  if (amount > allocated[index][1]) {
   // Send email:
   Logger.log('send email')
  }
}

форма screencap

1 Ответ

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

Если я вас правильно понял, вы хотите сделать следующее:

  • Когда пользователь отправляет форму, возьмите значения из ответа (полученные с помощью объекта события): townCity и currency.
  • Получить данные с другого листа, который содержит список городов (столбец B) и выделенный бюджет для каждого города (столбец C).
  • Найти город, отправленный пользователем, и проверьте выделенный бюджет.
  • Если currency, отправленный пользователем, превышает выделенный бюджет, отправьте электронное письмо.

Если это верно, вы можете изменить свою функцию sendEmails на эту:

function sendEmails(townCity, currency){
  var ss = SpreadsheetApp.openById("ssid");
  var sheet = ss.getSheetByName("Rates for validation check");
  var firstRow = 2;
  var firstCol = 2;
  var numRows = sheet.getLastRow() - firstRow + 1;
  var numCols = 2;
  var allocated = sheet.getRange(firstRow, firstCol, numRows, numCols).getValues();
  var index = allocated.map(function(value) {
    return value[0];
  }).indexOf(townCity);
  if (currency > allocated[index][1]) {
    // Send email:
    // MailApp.sendEmail(recipient, subject, body)
  }
}

В этой функции предопределенные города и бюджеты извлекаются в одном двумерном массиве, и используется indexOf найти индекс представленного города в этом массиве. После извлечения этого индекса он используется для поиска соответствующего бюджета allocated[index][1] и сравнения его с отправленным currency.

ОБНОВЛЕНИЕ:

В форме у вас есть несколько вопросов, которые называются Town/City for {country}, по одному на каждую страну. Чтобы узнать город, который нужно искать, сначала нужно проверить ответ на вопрос Country. Если это так, вы можете использовать свойство события namedValues ​​, объект, который содержит имена вопросов и значения из представления формы.

Это может быть что-то вроде этого (я предполагаю, что у вас есть вопрос под названием Currency:

function onFormSubmit(e) {
  var country = e.namedValues["Country"][0]; // Retrieve country from form submission
  var currency = e.namedValues["Amount"][0]; // Retrieve currency from form submission
  country = country.charAt(0).toUpperCase() + country.slice(1).toLowerCase(); // Transform country from all capitalized to first character capitalized
  var townCity = e.namedValues["Town/City for " + country][0]; // Look for value corresponding to this country town/city
  sendEmails(townCity, currency);
}

ОБНОВЛЕНИЕ 2:

Проблема, с которой вы столкнулись, что названия вопросов немного отличаются от ожидаемых:

  • В разделах городов и населенных пунктов страны все названия вопросов должны иметь формат Town/City for {countryName}, хотя во многих случаях в вашей форме это Town/City {countryName}, без for. Вы должны исправить это для всех ваших стран в вашей форме (или соответственно изменить скрипт).
  • Поскольку формат стран иногда пишется с большой буквы, toLowerCase имеет чтобы название страны использовалось в том же формате, что и в следующем разделе (только первый символ с большой буквы). Я добавил toLowerCase в сценарий, чтобы избежать этой проблемы.
  • Свойство, которое вы хотите отслеживать Я полагаю, это Amount, а не Currency. Я редактировал это в скрипте.

Примечания:

  • Я предполагаю, что вы уже установили форму отправить триггер. Если это не так, Вы должны установить его, вручную или программно .
  • Я предполагаю, что вы уже знаете, как отправить электронное письмо. Если это не так, вы можете начать с проверки MailApp.sendEmail (получатель, тема, тело) .

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...