Полный скрипт не запускается, когда onFormSubmit Triggered, но будет работать вручную с onEdit()

function BatteryInspection(e) {
  var range = e.range;
  var row = range.getRow();
  var col = range.getColumn()
  var sheet = range.getSheet();
  Logger.log("The row is " + row + " and column is " + col + " the sheet is " + sheet);

  var sheet, sheetName, colToCapitalize;

  var sheetName, colToCapitalize;
  colToCapitalize = 2;
  sheetName = "FormResponses1";
  if (sheet.getName() !== sheetName || e.range.rowStart < 2 || e.range.columnStart !== colToCapitalize || typeof e.value == "object") return;
  e.range.setValue(e.value.toUpperCase());

  sheet.getRange(row, 10).setFormula("=SUBSTITUTE(B" + row + ",\" \",\"\")");

  var cellcopy = sheet.getRange(row, 10);
  var cellvalues = cellcopy.getValues();

  sheet.getRange(row, 2).setValues(cellvalues);
  cellcopy.clearContent();

  sheet.getRange(row, 8).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,2,0)");
  sheet.getRange(row, 9).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,3,0)");
}

В результате я хочу, чтобы приведенный выше скрипт запускался, когда новая строка данных добавляется из формы Google в рабочий лист FormResponses1. Я уже создал форму Google, и новые данные добавляются в лист "FormResponses1", когда пользователь отправляет форму.

Вот видео на YouTube с изображением моей проблемы

Приведенный выше код работает нормально и делает то, что мне нужно, если я вручную добавляю новое значение в ячейку, например, если я напишу "dll 463" в ячейке "B2" на листе "FormResponses1".

Я установил триггер "Из электронной таблицы - При отправке формы" для функции onEdit, показанной выше, с помощью триггеров "Редактировать - Текущий проект" на панели инструментов в представлении редактора скриптов <>.

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

Я добавил больше строк Logger.log в приведенный выше код, чтобы увидеть, как далеко запускается сценарий, когда он запускается триггером "Из электронной таблицы - При отправке формы", но никакие другие журналы не отображаются после журнала редактирования строки и столбца.

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

Я пробовал: - Удаление и добавление нового триггера. - Создание новой версии - Удаление ответов формы - Изменение функции с onEdit() на onFormSubmit() - Отключение электронной таблицы и добавление новой электронной таблицы (с теми же именами листов и данными) со скриптом, скопированным в новый редактор скриптов электронной таблицы и удаление старой таблицы.

1 ответ

Проблема, с которой вы столкнулись (помимо написанного вами кода, также немного запутана), заключается в том, что, когда событие запускается с помощью "При редактировании" или "При отправке формы", объекты событий для них разные, поэтому они будут не имеют тех же свойств, и вы можете применить ту же логику, что и в своем коде.

Так выглядит объект редактирования и так выглядит объект отправки формы.

Знаю это. Я изменил ваш код следующим образом:

В вашей основной функции я проверяю, что является причиной срабатывания триггера, если это событие редактирования или отправки, затем в зависимости от события и если условия для обоих из них верны, я вызываю onEditChange или onSubmitChange функции.

function BatteryInspection(e) {
  var range = e.range;
  var row = range.getRow();
  var col = range.getColumn();
  var sheet = range.getSheet();
  var colToCapitalize = 2;
  var sheetName = "FormResponses1";
  // Let's see if it is a form or edit object, checking the namedValues properties
  if(!e.namedValues){
    // Edit event
    // Check the right conditions for an edit event
    if (sheet.getName() !== sheetName || row < 2 || col !== colToCapitalize || typeof e.value == "object") return;
    else onEditChange(e, sheet, row);
  } else {
    // Submit Event
     // Check the right conditions for a submit event
    if (sheet.getName() !== sheetName || row < 2 | typeof e.values != "object") return;
    else onSubmitChange(e, sheet, row);
  }
}

Внутри onEditChange а также onSubmitChange функций, я устанавливаю значения в правой ячейке в верхний регистр, а затем вызываю setFormulas функция.

// Call when there is an edit event 
function onEditChange(evt, sheet, row){
  // Uppercase the value where the triggered occured
  evt.range.setValue(evt.value.toUpperCase());
  setFormulas(sheet, row);
}

// Call when there is an submit event 
function onSubmitChange(evt, sheet, row){
  // Uppercase the value just in the value of the second col
  sheet.getRange(row, 2).setValue(evt.values[1].toUpperCase());
  setFormulas(sheet, row);
}

в setFormulas функция, как указывает название, я просто установил формулы, которые вы устанавливали ранее в своей основной функции BatteryInspection.

// Function for setting the formulas
// Call whether an edit or submit event happens
function setFormulas(sheet, row){
  sheet.getRange(row, 10).setFormula("=SUBSTITUTE(B" + row + ",\" \",\"\")");
  var cellcopy = sheet.getRange(row, 10);
  var cellvalues = cellcopy.getValues();
  sheet.getRange(row, 2).setValues(cellvalues);
  cellcopy.clearContent();
  sheet.getRange(row, 8).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,2,0)");
  sheet.getRange(row, 9).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,3,0)");
}

Теперь весь код будет выглядеть так:

function BatteryInspection(e) {
  var range = e.range;
  var row = range.getRow();
  var col = range.getColumn();
  var sheet = range.getSheet();
  var colToCapitalize = 2;
  var sheetName = "FormResponses1";
  // Let's see if it is a form or edit object, checking the namedValues properties
  if(!e.namedValues){
    // Edit event
    // Check the right conditions for an edit event
    if (sheet.getName() !== sheetName || row < 2 || col !== colToCapitalize || typeof e.value == "object") return;
    else onEditChange(e, sheet, row);
  } else {
    // Submit Event
     // Check the right conditions for a submit event
    if (sheet.getName() !== sheetName || row < 2 | typeof e.values != "object") return;
    else onSubmitChange(e, sheet, row);
  }
}

// Call when there is an edit event 
function onEditChange(evt, sheet, row){
  // Uppercase the value where the triggered occured
  evt.range.setValue(evt.value.toUpperCase());
  setFormulas(sheet, row);
}

// Call when there is an submit event 
function onSubmitChange(evt, sheet, row){
  // Uppercase the value just in the value of the second col
  sheet.getRange(row, 2).setValue(evt.values[1].toUpperCase());
  setFormulas(sheet, row);
}

// Function for setting the formulas
// Call whether an edit or submit event happens
function setFormulas(sheet, row){
  sheet.getRange(row, 10).setFormula("=SUBSTITUTE(B" + row + ",\" \",\"\")");
  var cellcopy = sheet.getRange(row, 10);
  var cellvalues = cellcopy.getValues();
  sheet.getRange(row, 2).setValues(cellvalues);
  cellcopy.clearContent();
  sheet.getRange(row, 8).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,2,0)");
  sheet.getRange(row, 9).setFormula("=VLOOKUP(B" + row + ",LookUpTable!A2:C1001,3,0)");
}

Документы

Для получения дополнительной информации вы также можете проверить: