Попытка скопировать строки с одного листа на другой с помощью флажка, в том же документе ... с изюминкой - PullRequest
0 голосов
/ 15 апреля 2020

Я строю инвентарь, в соответствии с которым на исходном листе есть основной список (полный инвентарь), рядом с каждым элементом которого есть флажки. Я хотел бы, чтобы каждый отмеченный элемент копировался на лист назначения в том порядке, в котором он указан в основном списке. Рассмотрим скриншоты ниже. Когда первые 4 флажка отмечены на исходном листе (назовем эти ячейки B3: B6), все четыре элемента (ячейки C3: H3, C4: H4, C5: H5 и C6: H6 соответственно) копируются на лист назначения , Когда 3-й продукт вниз (флажок B5) впоследствии не отмечен на исходном листе, соответствующее содержимое (ячейки C5: H5) на листе назначения удаляются, а оставшиеся строки сворачиваются вверх. Если бы B5 впоследствии был перепроверен, содержимое Продукта A было бы повторно вставлено в том порядке, в котором оно указано на исходном листе, и это выглядело бы как 2-й снимок экрана, где все 4 продукта снова присутствуют и в порядке. Будучи новичком во всем, что касается сценариев, я предполагаю, что это комбинация других решений, предложенных для вопроса «переместить строку с листа на лист» и L oop (для) какого-то рода? Спасибо миллион раз за вашу помощь и время! Исходный лист Scrsht 1 с установленными флажками, результат листа назначения Scrnsht 2 для Scrsht 1, исходный лист Scrsht 3 с непроверенной строкой, Результат листа назначения Scrsht 4 для снятого флажка в ScrSht 3

Итак Вот скрипт, который копирует строки из Sheet13 в Sheet14. Проблемы заключаются в том, что: 1. он добавляет их в конец списка назначения, потому что «target» var имеет ссылку на строку «.getLastRow + 1», 2. строки не исчезают / удаляются, когда флажок на исходный лист не отмечен, 3. и если флажок перепроверен, соответствующие данные снова добавляются в конец списка конечного листа (даже если он дублирован).

function onEdit(event) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var s = event.source.getActiveSheet();
    var r = event.source.getActiveRange();
 if(s.getName() == "Sheet13" && r.getColumn() == 2 && r.getValue() == true) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Sheet14");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 2);
    s.getRange(row, 3, 1, numColumns).copyTo(target); 
 }
}

У меня больше опыта с формулами , К сожалению, обе формулы «Query» и «IFerror / index / small» сталкиваются с одной и той же проблемой. То есть Кол-во в наличии: Кол-во, необходимое Колонки должны быть в состоянии изменить / манипулировать при изменении уровня запасов / потребностей. Как только вводится значение, обе формулы выдают ошибку разбора, предупреждая, что оно перезапишет введенное значение.

Кроме того, я, вероятно, должен был упомянуть об этом в исходном сообщении, но причина что я пытаюсь урезать полный список инвентаря, потому что есть несколько человек, для которых это предназначено. Никто не использует ВСЕ предметы, и не все используют одинаковые предметы. Итак, я хотел, чтобы люди могли выбирать / использовать только те предметы, которые они используют регулярно, и игнорировать предметы, которые они не используют.

ОБНОВЛЕНИЕ Я обновил имена листов / вкладок. Как Sheet13 и Sheet 14 были для "практики". Я смог получить половину? это сделано, и скрипт ниже вставляет / удаляет ячейки и использует copyTo именно так, как я этого хочу. Но, как написано, он оценивает только один флажок (B5 на исходном листе «Полная инвентаризация»), вставляет пустые ячейки на листе назначения («Shed Inventory») из B5: G5 и копирует информацию в ячейки E5: G5 источника лист («Полная инвентаризация») в ячейки B5: D5 на листе назначения («Инвентарь сарая»). Теперь мне просто нужно превратить его в al oop (и я попытался безуспешно), где он оценивает все флажки в столбце B и вставляет / копирует соответствующую строку, когда это необходимо. EG - если бы я проверял B3, B4 и B6, он вставлял бы ячейки / копировал информацию из соответствующих ячеек типа A, типа B, типа D в «Полная инвентаризация» и вставлял их в строки 3,4,5 в «Инвентарь сарая». Затем, если бы я впоследствии проверил B5, он вставил бы информационный тип C между типом B и типом D, развернув целевой лист, чтобы затем показать тип A, тип B, тип C, тип D (используя строки 3: 6 ). Надеюсь, что это объяснение имеет смысл. Пожалуйста помоги! Большое спасибо!

Вот ссылка, и для нее установлено «Любой, у кого есть ссылка, может редактировать»: https://docs.google.com/spreadsheets/d/1Rq13-NWomC8zDHZTHyWHl23LpOuwE7TfIDvrZxdlQiI/edit?usp=sharing

function insertDeleteCells() {
    var spreadsheet = SpreadsheetApp.getActive();
    var full = spreadsheet.getSheetByName("Full Inventory");
    var shed = spreadsheet.getSheetByName("Shed Inventory");
    var srange = full.getRange('E5:G5');
    var drange = shed.getRange('B5:D5');
    var checkbox = full.getRange('B5');
    var status = checkbox.getValue();
  if(status == true){
      shed.getRange('B5:G5').insertCells(SpreadsheetApp.Dimension.ROWS) && 
         srange.copyTo(drange);
  } else {
      shed.getRange('B5:G5').deleteCells(SpreadsheetApp.Dimension.ROWS);
  }
}

function onEdit(e) {
  if (
    e.source.getSheetName() == "Full Inventory" &&
    e.range.columnStart == 2 &&
    e.range.columnEnd == 2 &&
    e.range.rowStart >= 3 &&
    e.range.rowEnd <= 298
  ) {
    insertDeleteCells();
  }

UPDATE-2 Обнаружена непредвиденная проблема, отличная от попытки создания l oop. Хотите знать, есть ли способ ограничить область действия триггера onEdit, чтобы оценить только те ячейки, которые были изменены в данном диапазоне? Я пытался изменить вышеупомянутый скрипт, чтобы включить несколько флажков. Но столкнулся с проблемой, когда onEdit оценивает каждый флажок в диапазоне (столбце), а не только флажок, который был изменен. Например, если установлен один флажок (B5), а остальные остаются не отмеченными, сценарий добавляет группу пустых ячеек (C5: G5) для отмеченного флажка, а затем удаляет 3 группы ячеек (C3: G3, C4: G4). и C6: G6) для тех 3 флажков, которые остались непроверенными (даже если их значения не изменились). net - минус две группы клеток (если это имеет смысл). Есть ли способ ограничить функцию onEdit, чтобы оценивать только 1 флажок, который был отмечен (по очереди добавление ячеек), но не затрагивать те 3, которые не были изменены (чтобы впоследствии не удалить 3 группы ячеек)? Надеюсь, что все это имеет смысл!

...