Как можно, чтобы Google Sheets отправлял по электронной почте строку, если в эту строку введен адрес электронной почты? - PullRequest
1 голос
/ 20 января 2020

Я новичок в Javascript, но мне удалось изменить некоторые сценарии, которые я нашел в Интернете, чтобы получить строку по электронной почте по адресу в столбце B этой строки. Я застрял в трех местах:

  1. Как запустить сценарий при обновлении столбца B?
  2. Во второй строке моего кода я жестко закодировал номер строки как переменную dataRow. Как получить обновленную строку из моей электронной таблицы?
  3. В некоторых случаях HTML выполняет рендеринг, но не в других. Ширина td в строке 22 не работает, и это не форматирование html в строках 46 и 47. Я испробовал несколько методов, но ничего не работает.

Спасибо!

function sendEmails() {
	var sheet = SpreadsheetApp.getActiveSheet();
	var dataRow = 232; //updated row in spreadhseet
	var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
	var data = sh.getRange("E:T").getValues();
	var TABLEFORMAT = 'cellspacing="2" cellpadding="2" dir="ltr" border="1" style="table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:1px solid #ccc;font-weight:normal;color:black;background-color:white;text-align:center;text-decoration:none;font-style:normal;"'
	var htmltable = ['<table ' + TABLEFORMAT +'>'];

	row = 0;

	htmltable += '<tr>';

	for (col = 0 ;col<data[row].length; col++){
	  if (data[row][col] === "" || 0) {htmltable += '<td>' + 'None' + '</td>';} 
	  else
		if (row === 0)  {
		  htmltable += '<th>' + data[row][col] + '</th>';
		}
	  else 
		if (col===10){htmltable += '<td>' + data[row][col] + '</td>';}
			else
			{htmltable += '<td width=400px" style="width:400px; background-color:yellow;">' + data[row][col] + '</td>';}
	}

	htmltable += '</tr>';

	row = dataRow - 1;

	htmltable += '<tr>';
	for (col = 0 ;col<16; col++){
	  if (data[row][col] === "" || 0) {htmltable += '<td>' + 'None' + '</td>';} 
	  else {htmltable += '<td>' + data[row][col] + '</td>';}
	}

	htmltable += '</tr>';

	htmltable += '</table>';


	var dataRange = sheet.getRange(dataRow, 1, 1, 19)
	var data = dataRange.getValues();
	for (i in data) {
		var row = data[i];
		var emailAddress = row[1];
		var ccAddress = row[2];
		var signature = '<span style="font-family:"Arial",sans-serif">Best</span></br>Adam Schwartz </span> </br><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:#48B8DD">  <stong>  MANAGER OF ESCALATIONS - RESIDENTIAL</stong></span></br><span style="font-family:"Arial",sans-serif">SMS ASSIST</span><span style="font-size:9.0pt;font-family:"Arial",sans-serif;color:#6C6C6C">  875 N. Michigan Ave. | Suite 2800 | Chicago, IL 60611  </span>';
		var message = "Hello " + row[4] + "," + '</br></br>' +"One of your escalation model tasks was randomly selected for QA last week. Your scores are below, along with my notes." + '</br></br>' + htmltable + '</br></br>' + signature; // Assemble the body text
		var subject = "Preventive Escalation Model QA " + row[19];
		MailApp.sendEmail(emailAddress, subject, message, {htmlBody:message,cc:ccAddress});
	}
}

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Во-первых, вам нужен триггер onEdit для запуска функции каждый раз, когда столбец B редактирует электронную таблицу. Кроме того, поскольку вы хотите отправлять электронные письма, простого триггера будет недостаточно (см. Ограничения простых триггеров здесь ), вам необходимо установить триггер. Вы можете сделать это вручную или программно . Здесь я предоставляю код для программной установки триггера редактирования. Вам нужно будет запустить эту функцию один раз:

function createEditTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('sendEmails')
      .forSpreadsheet(ss)
      .onEdit()
      .create();
}

Это заставит sendEmails запускаться каждый раз, когда электронная таблица редактируется. Вам нужно будет поставить условие, которое проверяет, находится ли отредактированный диапазон в столбце B. И вы можете сделать это, если используете Объект Event , который будет получен sendEmails в качестве параметра и который содержит информация о контексте, который запустил триггер.

Допустим, что, как обычно, объект события называется e. Вы можете получить доступ к диапазону, который был отредактирован, выполнив e.range. И вы можете знать столбец, который был отредактирован, если вы сделаете e.range.getColumn(). Кроме того, вы можете узнать, какая строка была обновлена, если вы выполните e.range.getRow() (что было вашей второй проблемой).

С учетом всего сказанного вам придется изменить функцию sendEmails следующим образом. Вам нужно изменить это:

function sendEmails() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var dataRow = 232; //updated row in spreadhseet
    var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // Rest of the code
}

На это:

function sendEmails(e) {
  var range;
  if (!e) range = SpreadsheetApp.getActiveRange(); 
  else range = e.range; // Edited range
  var sh = range.getSheet(); // Edited sheet
  var dataRow = range.getRow(); // Edited row index
  var column = range.getColumn(); // Edited column index
  var yourSheetName = "Sheet1"; // Please change accordingly
  // Check that edited sheet is the one you want to track change from
  // and that edited column is B (index 2):
  if (sh.getName() == yourSheetName && column == 2) {
    // Rest of the code
  }
}

Очень важно, чтобы вы написали e в качестве аргумента для функции, в противном случае код выиграл ' не знаю, что такое e. Также имейте в виду, что это будет работать только в том случае, если электронная таблица редактируется пользователем вручную, а не программно скриптом.

Кроме того, в этом примере лист, с которого вы хотите отслеживать изменения, называется Sheet1, пожалуйста, измените его в коде, если это не так.

Наконец, что касается HTML, я думаю, что вы пропускаете некоторые цитаты в нескольких местах, и поэтому он не работает должным образом. В этой строке, например:

'<td width=400px" style="width:400px; background-color:yellow;">'

400px отсутствует первый ", это может быть width="400px".

Я вижу аналогичное, что происходит в этой строке:

'<span style="font-family:"Arial",sans-serif">Best</span> // ...

Здесь вы должны использовать escape-символы (\"), в противном случае скрипт думает, что вы хотите закрыть блок кавычек, когда вы хотите открыть новый. Вы должны сделать что-то вроде этого:

'<span style="font-family:\"Arial\",sans-serif">Best</span> // ...

Надеюсь, это поможет.

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

Я могу помочь с 1 и 2. 3 - это вопрос форматирования электронной почты, и обычно это боль.

  1. Есть функция onEdit(e), которая передает объект в функцию. например, когда я редактирую ячейку A7, чтобы она содержала только букву a, объект (e) содержит это:

    {"range": {"columnStart": 1, "rowStart": 7, "rowEnd": 7 , "columnEnd": 1}, "value": "a"}

В функции onEdit вы можете проверить (range.columnStart <= 2 && range.columnEnd >= 2) на наличие изменений в столбце B

Возможно, вы сможете использовать значение строки из объекта выше. В противном случае вы можете найти последнюю строку на листе, используя var lastRow = sh.getLastRow()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...