У меня есть форма Google, которая отправляет заполненные данные в Google Sheet.С помощью устанавливаемого триггера (запускается при отправке формы) мне удалось скопировать самую новую строку в новый лист, добавив новую строку с этими данными.Однако иногда триггер случайным образом срабатывает несколько раз и поэтому добавляет 2 или более строк с одинаковыми значениями на другой лист.Я убежден, что проблема заключается в триггере, поскольку я обнаружил свидетельство многократного срабатывания триггера на странице обзора концентратора G Suite Developer.Кто-нибудь еще испытывает те же проблемы или знает, какие обходные пути будут работать?
РЕДАКТИРОВАТЬ : Вот полный код.У меня есть 2 листа, один называется «FormResponse», где входные данные формы копируются автоматически.И второй лист, называемый «Контрольный список», где устанавливаемый триггер срабатывает всякий раз, когда приходит ответ формы. Затем он запускает функцию «insertIntoChecklist ()».У меня есть второй устанавливаемый триггер для "edited ()".Способ еще не реализован.Однако в будущем потребуется вызвать метод, когда пользователь редактирует лист «Контрольный список».
Устанавливаемые триггеры задаются в центре разработчика G Suite:
function edited() {
var sheet = SpreadsheetApp.getActiveSheet();
switch(sheet.getSheetName()){
case "Checkliste":
//checkIfFinished(); --> Method will be implemented later
break;
default:
Logger.log("Unknown Sheet name in onEdit method!");
}
}
// Method to insert into the Checklist sheet depending on the team
function insertIntoChecklist() {
// Spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
// FormResponse
var formResponse = ss.getSheetByName("FormResponse");
var lastRowFormResponse = formResponse.getLastRow();
// Values FormResponse
var prename = formResponse.getRange(lastRowFormResponse, 2.0).getValue();
var surname = formResponse.getRange(lastRowFormResponse, 3.0).getValue();
var team = formResponse.getRange(lastRowFormResponse, 4.0).getValue();
var date = formResponse.getRange(lastRowFormResponse, 5.0).getValue();
// Checklist
var checklist = ss.getSheetByName("Checkliste");
var lastRowChecklist = checklist.getLastRow();
lastRowChecklist++;
// Values Checklist
var googleAccount = checklist.getRange("E" + lastRowChecklist);
var phone = checklist.getRange("F" + lastRowChecklist);
var workstation = checklist.getRange("H" + lastRowChecklist);
// Based on the submitted team create instantiate a method that gets evoked
switch(team){
case "Immo":
createImmo(checklist, prename, surname, team, date, email, googleAccount, phone, workstation);
break;
case "IT":
createIT(checklist, prename, surname, team, date, email, googleAccount, phone, workstation);
break;
default:
checklist.appendRow(["no team detected"]);
}
}
var hardwareTypes = {
winPC : "- Windows PC\n",
iMac: "- iMac\n",
};
var phoneTypes = {
hardphone : "- Hardphone\n",
softphone : "- Softphone\n"
};
function createImmo(checklist, prename, surname, team, date, email, googleAccount, phone, workstation) {
checklist.appendRow([prename, surname, team, date]);
addCheckbox(googleAccount);
addCheckbox(phone);
addNote(phone, phoneTypes.softphone);
addCheckbox(workstation);
addNote(workstation, hardwareTypes.winLap);
}
function createIT(checklist, prename, surname, team, date, email, googleAccount, phone, workstation) {
checklist.appendRow([prename, surname, team, date]);
addCheckbox(googleAccount);
addCheckbox(phone);
addNote(phone, phoneTypes.hardphone);
addCheckbox(workstation);
setNotAvailableCell(checklist);
}
function addCheckbox(checkboxRange) {
var enforceCheckbox = SpreadsheetApp.newDataValidation();
enforceCheckbox.requireCheckbox();
enforceCheckbox.setAllowInvalid(false);
enforceCheckbox.build();
checkboxRange.setDataValidation(enforceCheckbox);
}
function addNote(range, note) {
range.setNote(note);
}
function setNotAvailableCell(checklist) {
var rowRange = checklist.getRange(checklist.getLastRow(), 1, 1,
checklist.getLastColumn());
var values = rowRange.getValues();
for (var i = 0; i <= 0; i++){
for (var j = 4; j < values[i].length; j++) {
var currentValue = rowRange.getCell(i+1,j+1);
var currentRange =
checklist.getRange(currentValue.getRow(),currentValue.getColumn());
if (values[i][j] !== false && values[i][j] !== true) {
currentRange.setValue("n/a");
currentRange.setBackground("#A9A9A9");
currentRange.setHorizontalAlignment("center");
}
}
}
}