Как я могу скопировать диапазон на другой лист на основе значения флажка, а затем удалить на новом листе, сохраняя оба флажка в актуальном состоянии - PullRequest
1 голос
/ 13 февраля 2020

Мне нужна помощь по этому коду. У меня есть свой лист источника "Список агентств". Когда флажок в столбце J установлен в True, данные в столбцах K-Последний столбец копируются на лист «Маршрут», начиная с первой пустой строки и столбца K. Эта формула работает, однако мне нужно добавить некоторые функции и не могу найти ответ. Мне нужно:

  • Я хочу иметь возможность установить флажок, скопировать строку в «Маршрут». Затем на «Маршруте» установите флажок с данными. Когда я снимаю флажок в «Маршруте», я хочу, чтобы данные были очищены, и соответствующий флажок в «Списке агентств» также должен быть снят.

  • Я также должен иметь возможность чтобы установить оба флажка с помощью мыши. И кажется, что если ячейка содержит формулу, вы не можете переключаться. Есть ли способ обойти это?

  • В настоящее время я копирую данные в последнюю строку в «Маршруте». Но если на листе в этой строке где-либо еще есть формула или столбец, он обрабатывает строку как не пустую. В частности, у меня не может быть флажка в столбце «Маршрут»! J: J вниз по листу, потому что тогда строка не пуста, а данные идут в самый низ. Я попытался использовать код, который будет смотреть на последнюю строку столбца O, но затем вся формула перестала работать: var target = targetSheet.getRange(targetSheet.getRange(O:O).getLastRow() + 1,11);

  • Я думал об использовании VLOOKUP или Match или какой-либо другой формулы сканировать столбец в «маршруте» на наличие совпадений, и если совпадений нет, флажок устанавливается в ЛОЖЬ. Но опять же, тогда я не могу установить флажок.

Есть ли способ поддерживать оба флажка в актуальном состоянии и копировать / очищать данные в «Маршруте» на основе этого флажка ? Спасибо!

Вот ссылка на образец листа: Образец листа

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();
    if (s.getName() == "Agency List" && r.getColumn() == 3 && r.getValue() == true) {
        var row = r.getRow();
        var numColumns = s.getLastColumn();
        var targetSheet = ss.getSheetByName("Itinerary");
        var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 11);
        s.getRange(row, 4, 1, numColumns).copyTo(target, { contentsOnly: true });
    } else if (s.getName() == "Itinerary" && r.getColumn() == 9 && r.getValue() == false) {
        var row = r.getRow();
        var numColumns = s.getLastColumn();
        s.deleteRow(row);
    }
}

1 Ответ

0 голосов
/ 18 февраля 2020

Хорошо, @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;
            }
        }
    }
}

Объяснение

Итак, у вас есть три случая, которые вам нужно обработать здесь.

  1. Вы проверяете строку в Список агентств , чтобы создать новую запись в Маршрут .
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;
            }
        }
    }

Здесь удаление строки довольно просто, поскольку вы извлекаете это из объекта события. Хотя в этом случае нам потребуется выполнить итерацию для каждой пары значений из свойств, поскольку мы сохранили ключ как строку Список агентств

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...