Хорошо, @Sio. Я думаю, что сделал исправление, которое могло бы помочь вам.
По сути, ваша проблема заключается в том, чтобы отслеживать, какая строка в Маршрут соответствует строке в Список агентств .
Для того, чтобы иметь такой тип постоянства в Apps Script без фактического сохранения на листе, я нашел этот удобный Сервис под названием PropertiesService
. Там я хранил строки в парах для последующего извлечения.
Код
function onEdit(event) {
// assumes source data in sheet named "Agency List"
// target sheet of move to named "Itinerary"
// getColumn with check-boxes is currently set to colu 3 or C
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
var row = r.getRow();
var numColumns = s.getLastColumn();
Logger.log(r.getValue());
if (s.getName() == "Agency List" && r.getColumn() == 3 && r.getValue() == true) {
// Create the record in "Itnerary"
var prop = PropertiesService.getDocumentProperties();
var targetSheet = ss.getSheetByName("Itinerary");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 11);
s.getRange(row, 4, 1, numColumns).copyTo(target, { contentsOnly: true });
// Insert checkbox cell (already checked)
targetSheet.getRange(target.getRow(), 10).insertCheckboxes().check();
prop.setProperty(row, target.getRow());
} else if (s.getName() == "Agency List" && r.getColumn() == 3 && r.getValue() == "") {
// Remove the row from "Itinerary" when the checkbox in "Agency List" is unchecked
var prop = PropertiesService.getDocumentProperties();
var targetRow = prop.getProperty(row);
ss.getSheetByName("Itinerary").deleteRow(targetRow);
Logger.log("Deleted the " + targetRow + "row from " + s.getName());
prop.deleteProperty(row);
} else if (s.getName() == "Itinerary" && r.getColumn() == 10 && r.getValue() == false) {
// Remove the row from "Itinerary"when the checkbox is unchecked and unchecks in "Agency List"
var prop = PropertiesService.getDocumentProperties();
s.deleteRow(row);
// Look the corresponding row in "Agency List"
var keys = prop.getKeys();
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (prop.getProperty(key) == row) {
ss.getSheetByName("Agency List").getRange(key, 3).setValue(false);
prop.deleteProperty(key)
break;
}
}
}
}
Объяснение
Итак, у вас есть три случая, которые вам нужно обработать здесь.
- Вы проверяете строку в Список агентств , чтобы создать новую запись в Маршрут .
if (s.getName() == "Agency List" && r.getColumn() == 3 && r.getValue() == true) {
// Create the record in "Itnerary"
var prop = PropertiesService.getDocumentProperties();
var targetSheet = ss.getSheetByName("Itinerary");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 11);
s.getRange(row, 4, 1, numColumns).copyTo(target, { contentsOnly: true });
// Insert checkbox cell (already checked)
targetSheet.getRange(target.getRow(), 10).insertCheckboxes().check();
prop.setProperty(row, target.getRow());
}
Это тот, который у вас уже был, просто добавив insertCheckboxes
в 10-м столбце (J). Также сохраняется пара строк для последующего извлечения. Посмотрите, что я храню его на уровне документа.
Вы снимаете флажок в
Список агентств , чтобы удалить строку в
Маршрут } else if (s.getName() == "Agency List" && r.getColumn() == 3 && r.getValue() == "") {
// Remove the row from "Itinerary" when the checkbox in "Agency List" is unchecked
var prop = PropertiesService.getDocumentProperties();
var targetRow = prop.getProperty(row);
ss.getSheetByName("Itinerary").deleteRow(targetRow);
Logger.log("Deleted the " + targetRow + "row from " + s.getName());
prop.deleteProperty(row);
}
Получение строки, которую мы должны удалить через документ свойства. Затем используйте deleteRow
в Маршрут и избавьтесь от записи в наших свойствах с помощью deleteProperty
.
Вы снимаете флажок с строки в
Маршрут , чтобы удалить эту строку и снять отметку с строки в
Список агентств .
} else if (s.getName() == "Itinerary" && r.getColumn() == 10 && r.getValue() == false) {
// Remove the row from "Itinerary"when the checkbox is unchecked and unchecks in "Agency List"
var prop = PropertiesService.getDocumentProperties();
s.deleteRow(row);
// Look the corresponding row in "Agency List"
var keys = prop.getKeys();
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (prop.getProperty(key) == row) {
ss.getSheetByName("Agency List").getRange(key, 3).setValue(false);
prop.deleteProperty(key)
break;
}
}
}
Здесь удаление строки довольно просто, поскольку вы извлекаете это из объекта события. Хотя в этом случае нам потребуется выполнить итерацию для каждой пары значений из свойств, поскольку мы сохранили ключ как строку Список агентств
Ссылка