Почему мой номер столбца для функции 2 смещается, когда я объединяю его с функцией 1? - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь придумать скрипт, который выполняет эти две вещи по порядку при вызове из триггера «При отправке формы»:

  1. Добавляет порядковый идентификационный номер в первый столбец строки вновь представленных данных формы Google,

  2. Отправляет информацию из этой строки по электронной почте.

У меня есть два отдельных сценария, каждый из которых отлично работает самостоятельно, но когда я пытаюсь запустить их вместе, номера столбцов во втором сценарии смещаются на -1, что означает, что ncDate отображается в электронном письме как ncID, ncType отображается как ncDate и т. д.

Я попытался объединить два сценария таким образом:

function assignID(e) {
  var sheetID = SpreadsheetApp.getActiveSheet();
  var colID =  SpreadsheetApp.getActiveSheet().getLastRow();

  sheetID.getRange(colID,1).setValue(colID);
  SpreadsheetApp.flush();
  sendEmail(e.range);
}


function sendEmail(range) {
  var values = range.getValues();
  var col = values[0];

  var ncID = col[0];
  var ncDate = col[1];
  var ncType = col[2];
  var ncLocation = col[3];
  var ncJobNo = col[4];
  var ncPartNo = col[5];
  var ncPartDesc = col[6];
  var ncPartQty = col[7];
  var ncDetails = col[8];
  var ncPhotos = col[9];
  var ncProposedSol = col[10];
  var ncEmail = col[11];

  var emailRecipients = "test@email.com";
  var emailSubject = ncID+": "+ncType+" ("+ncEmail+")";
  var emailBody = "<h3>Here is the latest issue "+ncEmail+":</h3><hr /> \
  <p> \
  <h1 style='line-height:90%'>"+ncType+": "+ncLocation+"<br /> \
  <span style='font-size:60%'>("+ncDate+")</span></h1> \
  </p><hr /> \
  <p> \
  <strong>ISSUE TYPE:</strong><br /> \
  "+ncType+" \
  </p><p> \
  <strong>OCCURRENCE LOCATION:</strong><br /> \
  "+ncLocation+" \
  </p><p> \
  <strong>JOB NUMBER:</strong><br /> \
  "+ncJobNo+" \
  </p><p> \
  <strong>PART NUMBER:</strong><br /> \
  "+ncPartNo+" \
  </p><p> \
  <strong>LINKS:</strong><ul> \
  <li>Photo(s) = "+ncPhotos+"</li> \
  <li>Email = "+ncEmail+"</li> \
  </ul></p><p> \
  <strong>PART DESCRIPTION:</strong><br /> \
  "+ncPartDesc+" \
  </p><p> \
  <strong>FOLLOW UP:</strong> \
  "+ncEmail+" \
  </p>"; 

  MailApp.sendEmail({
    to: emailRecipients,
    subject: emailSubject,
    htmlBody: emailBody
  });
}

Идентификатор формы добавляется, затем электронное письмо отправляется, но все данные извлекаются из одного столбца слева от требуемого. Что мне здесь не хватает?

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Возможно, проблема в том, что sendEmail не вызывается с ожидаемым диапазоном. Вы можете устранить проблему, вставив операторы журнала, например Logger.log(range.getA1Notation()), в верхней части функции sendEmail.

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

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

function assignID(e) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var colID = sheet.getLastRow();

  sheet.getRange(colID, 1).setValue(colID);
  SpreadsheetApp.flush();

  var eventRow = e.range.getRow();
  var eventNumCols = e.range.getNumColumns();

  var startRow = eventRow;
  var startCol = 1;
  var numRows = 1;
  var numCols = eventNumCols + 1;

  var range = sheet.getRange(startRow, startCol, numRows, numCols);
  sendEmail(range);
}

function sendEmail(range) {
  var values = range.getValues();
  var row = values[0];

  var ncID = row[0];
  var ncDate = row[1];
  var ncType = row[2];
  var ncLocation = row[3];
  var ncJobNo = row[4];
  var ncPartNo = row[5];
  var ncPartDesc = row[6];
  var ncPartQty = row[7];
  var ncDetails = row[8];
  var ncPhotos = row[9];
  var ncProposedSol = row[10];
  var ncEmail = row[11];

  ...

}

Кроме того, вы можете изучить возможности в виде шаблона HTML , которые позволяют вам поместить большую часть HTML в отдельный файл вместо того, чтобы создавать его с помощью JavaScript.

1 голос
/ 19 июня 2019

При реализации триггера необязательный параметр «e» позволяет получить доступ к диапазону событий. Однако, как указал Купер: форма Google поместит отметку с датой в первый столбец. Таким образом, индексы столбцов будут смещены по сравнению с тем, что вы ожидаете. Таким образом, вы должны сместить индексы ячеек, из которых вы извлекаете свои данные соответственно.

Что касается вашего последовательного идентификационного номера, я бы посоветовал вам реализовать его в пустой ячейке, в дополнительном новом столбце.

Например: Вы можете использовать для этого столбец 13 (зная, что столбец 1 зарезервирован для отметки времени, а столбцы 2–12 заполнены данными из отправки формы).

  sheetID.getRange(colID,13).setValue(colID)

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

 function assignID(e) {      
  var sheetID = SpreadsheetApp.getActiveSheet()
  var colID =  SpreadsheetApp.getActiveSheet().getLastRow()

  sheetID.getRange(colID,13).setValue(colID)
  var range =sheetID.getRange(colID,1,1, sheetID.getMaxColumns())
  SpreadsheetApp.flush()
  sendEmail(range)
}
0 голосов
/ 18 июня 2019

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

Данные, которые вам потребуются для электронной почты, будут находиться либо в e.values, либо в e.namedValues, и с помощью onFormSubmit из электронной таблицы вы всегда сможете гарантировать получение правильных данных, даже когда поступают заявки на отправку формы. в быстрый от других пользователей формы.

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