Полный скрипт не запускается, когда 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)");
}
Документы
Для получения дополнительной информации вы также можете проверить: