Получите последнюю строку с несколькими пользователями, отредактировав электронную таблицу - PullRequest
1 голос
/ 28 октября 2019

Это мой первый раз, я учусь. Я постараюсь объяснить мою проблему. Я буду собирать данные с помощью Odk Collect и синхронизировать их с электронной таблицей. 10 пользователей будут отправлять данные в эту таблицу в разное время. Мне нужно взять последнюю введенную строку и отправить данные по электронной почте. Мой вопрос, если "getLastRow" делает работу. С 10 пользователями я боюсь потерять какую-то строку при отправке электронной почты. Заранее спасибо.

У меня уже есть последний ряд и столбец, который я хочу. Я использую триггер onEdit. Мой главный вопрос: если процесс выполняется последовательно, если 3 пользователя отправляют данные одновременно? Я теряю 2 строки или getLastRow делает одну за другой

function myLastRow() {
 var ss=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var lr = ss.getLastRow();
 var getFiltro = ss.getRange(lr, 1).getValues();

1 Ответ

0 голосов
/ 28 октября 2019

Ответ:

Как объяснено в ссылке, на которую ссылается @TheMaster, если многие люди одновременно редактируют лист, некоторые изменения могут не отслеживаться триггером onEdit.

Обходной путь:

Чтобы убедиться, что письма из всех строк отправляются, я бы предложил добавить столбец рядом с данными, который будет отслеживать, какие письма были отправлены. onEdit будет перебирать все строки, находить те, которые не были отправлены, отправлять электронные письма и писать Sent в соответствующих ячейках. Я создал небольшой пример того, как это будет выглядеть так:

function onEditTrigger(e) {
  var sheet = e.source.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  // Loops through each row and send email in rows that don't have "Sent" in 4th row
  // Starts at row 2 (first row is for headers)
  for(var i = 1; i < values.length; i++) {
    var row = values[i];
    var status = row[3];
    var recipient = row[0];
    var subject = row[1];
    var body = row[2];
    // Checks that the email from this row has not been sent and all data cells in the row are populated (not sure if you want this last thing, change accordingly)
    if(status != "Sent" && recipient != "" && subject != "" && body != "") {
      // In this example "recipient" is in first column, subject in second and body in third. Change accordingly
      MailApp.sendEmail(recipient, subject, body); 
      sheet.getRange(i + 1, 4).setValue("Sent");
    }
  }
}

Помните, что вы не можете использовать MailApp.sendEmail в простом onEdit, как это происходит в любом сервисе, требующем авторизации . Таким образом, ваша функция не может быть вызвана onEdit(e), и вы должны установить ее, запустив сначала функцию, которая создает триггер, например:

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

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

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