Полный сценарий не запускается при запуске onFormSubmit, но будет работать вручную с помощью onEdit () - PullRequest
0 голосов
/ 11 января 2020
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 в приведенный выше код, чтобы увидеть, как далеко работает сценарий, когда он запускается триггером «Из электронной таблицы - При отправке формы», но после строки a другие журналы не отображаются. nd Колонка редактирования журнала.

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

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

1 Ответ

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

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

Вот как Редактировать объект Похоже, вот как выглядит Форма отправки Объект .

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

В вашей основной функции я проверяю причину триггера, если это событие редактирования или отправки, затем в зависимости от события и условий для обоих из них true, я вызываю функции 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)");
}

Документы

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

...