Потерять некоторые данные при многократном добавлении строк в нижнюю часть таблицы Google - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть форма Google. Ответы из формы отправляются в подключенную таблицу. A также имеет триггер Google Script 'onSubmitForm, который принимает новые ответы и помещает некоторые из них (которые удовлетворяют некоторым требованиям) в другую таблицу.

Итак, мой сценарий помещает ответы в конец моей таблицы (lastRow+1) index.

Проблема в том, что мою форму отправляют несколько человек одновременно. Я думаю, что это происходит потому, что скрипт выполняется в одно и то же время, поэтому индекс (lastRow+1) может быть одинаковым для нескольких выполняющихся скриптов. Таким образом, одновременно выполняющиеся сценарии переписывают некоторые строки. И некоторые данные теряются.

Вопрос в том, как справиться с этой ситуацией? Как добавить все ответы (которые должны быть добавлены) и не потерять некоторые из них?

A имеет 2 реализации добавления данных. Первый:

// Добавляет нового курьера вниз таблицы 
function addCourierTnTheBottom(response) {
  var destinationSpreadsheetID = '[table ID]';
  var destinationRangeName = 'Курьеры!A1:O';
  var destinationValues = Sheets.Spreadsheets.Values.get(destinationSpreadsheetID, destinationRangeName).values;
  var valueInputOption = "RAW"
  var lastDestinationRow = destinationValues.length
  var valueRanges = []

  // Формируем данные
  var edit_date_formatted = Utilities.formatDate(new Date(), 'Europe/Moscow',  "dd.MM.yyyy HH:mm:ss");
  var created_date = response[0];
  var full_name = response[1];
  var work_phone = response[2];
  var contact_phone = response[3];
  var citizenship = response[4];
  var age = response[5];
  var city = response[6];
  var source = response[7];
  var interview_date = response[8];
  var status = "Новый. Тестирование";
  var test_form_submitted_status = "Не отправлено";

  // отправка формы на тестирование
  var result = submitFormOnTest(response);
  if (result) { test_form_submitted_status = "Успешно отправлена"; }

  var rangeName = getRangeForRow(lastDestinationRow, 'A', 'O');
  var values = [city, created_date, edit_date_formatted, full_name, work_phone, contact_phone, citizenship, source, interview_date, status, "","","","",test_form_submitted_status];

  // Отправляем данные в таблицу
  var valueRange = Sheets.newValueRange()
  valueRange.values = [values]
  var result = Sheets.Spreadsheets.Values.update(valueRange, destinationSpreadsheetID, rangeName, { valueInputOption: valueInputOption });
  Logger.log(result)

  // Дополнительная функция
  function getRangeForRow(rowNumber, columnFirst, columnLast) {
    return 'Курьеры!' + columnFirst + (rowNumber+1) + ':' + columnLast + (rowNumber+1)
  }
}

Второй:

function addNewCourierToTheBottom2(response) {

  // Формируем данные
  var edit_date_formatted = Utilities.formatDate(new Date(), 'Europe/Moscow',  "dd.MM.yyyy HH:mm:ss");
  var created_date = response[0];
  var full_name = response[1];
  var work_phone = response[2];
  var contact_phone = response[3];
  var citizenship = response[4];
  var age = response[5];
  var city = response[6];
  var source = response[7];
  var interview_date = response[8];
  var status = "Новый. Тестирование";
  var test_form_submitted_status = "Не отправлено";

  // отправка формы на тестирование
  var result = submitFormOnTest(response);
  if (result) { test_form_submitted_status = "Успешно отправлена"; }

  var values = [city, created_date, edit_date_formatted, full_name, work_phone, contact_phone, citizenship, source, interview_date, status, "","","","",test_form_submitted_status];

  // Заносим все после последней строки таблицы
  var ss = SpreadsheetApp.openById("[table ID]")
  var sheet = ss.getSheetByName("Курьеры")
  var lastRow = sheet.getLastRow();
  sheet.getRange(lastRow + 1, 1, 1, 15).setValues([values]); 
}

У обоих есть эта проблема. Я понятия не имею, как это исправить. Вы можете помочь?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

ВОЗМОЖНОЕ РЕШЕНИЕ

Вместо копирования данных onFormSubmit сделать это на управляемом временем триггере

  • Реализация и дополнительный столбец с флажками
  • Каждый раз, когда функция запускается по триггеру, она
    • находит все строки, где флажок еще не установлен
    • копирует эти строки
    • проверяет соответствующие флажки поэтому при следующем запуске функции те же строки не будут скопированы снова

Вместо флажков можно альтернативно, например, сохранить последнюю скопированную строку в Scriptproperties и начать копирование по следующему триггеру из этой строки

0 голосов
/ 02 апреля 2020

Не используйте lastRow () для получения необходимых данных от объекта события. Вы даже можете получить номер строки из диапазона. https://developers.google.com/apps-script/guides/triggers/events#form -submit

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