Google Листы перемещают строку на другой лист по 2 критериям ячеек в текущей строке

#javascript #google-apps-script #google-sheets

Вопрос:

Я пытаюсь переместить строку с одного листа на основе критериев 2 ячеек:

  1. флажок установлен (ВЕРНО)
  2. Текст ячейки = ЗАКРЫТ, но в этой ячейке на самом деле есть переход на другой лист (=IFERROR(VLOOKUP(A42,'01 - Master RO Entry Sheet'!A:L,3, ""),""))

Вот что у меня есть:

 function onEdit(event) {
  // assumes source data in sheet named "03 - Schedule"
  // target sheet of move to named "History"
  // getColumn with check-boxes is currently set to colu 2 or B
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "03 - Schedule" amp;amp; r.getColumn() == 2 amp;amp; r.getValue() == true amp;amp; r.getColumn() == 3 amp;amp; r.getValue() == "CLOSED"){
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("10 - Master History");
    var target = targetSheet.getRange(targetSheet.getLastRow()   1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    s.deleteRow(row);
  
  }
}
 

Комментарии:

1. Каково текущее поведение? Что вы хотите изменить?

Ответ №1:

вот обновление кода в соответствии с вашим исправлением вопроса

 const archScheme = [{sourceSheet: '01 - Master RO Entry Sheet', targetSheet: '11 - Customer History', srcColumn: 'A'},
                    {sourceSheet: '02 - Estimates to Complete', targetSheet: '12 - Estimate History', srcColumn: 'A'}];

// the function moves row #rowNum from 'fromSheet' to 'toSheet'
function moveDataRow(rowNum,fromSheet,toSheet,ss){
  if (rowNum==-1) return;
  let scrSheet = ss.getSheetByName(fromSheet),
      trgSheet = ss.getSheetByName(toSheet);

  scrSheet.getRange(rowNum ':' rowNum).moveTo(
    trgSheet.getRange(trgSheet.getDataRange().getNumRows() 1,1));
  scrSheet.deleteRow(rowNum);

  // here we replace the names of the sheets in the formulas according to archScheme
  let range = trgSheet.getRange(trgSheet.getDataRange().getNumRows() ':' trgSheet.getDataRange().getNumRows()),
      originalFormulas = range.getFormulas()[0],
      originalValues = range.getValues()[0];
  range.setValues([originalFormulas.map((cell,i) => { if (cell=='') { return originalValues[i] } 
                                                        else 
                                                      { archScheme.forEach(sh => cell = cell.replace(sh.sourceSheet,sh.targetSheet))
                                                        return cell}  } )])    
}

function onEdit(e) {
  let range = e.range, 
      row = range.rowStart,
      col = range.columnStart,
      scrSheet = range.getSheet();
  
  if (scrSheet.getName()=='03 - Schedule' amp;amp; col==2 amp;amp; range.getValue()==true amp;amp; range.offset(0,1).getValue()=='CLOSED'){
    let ss = SpreadsheetApp.getActiveSpreadsheet(),
        orderNum = range.offset(0,1-col).getValue();
    moveDataRow(row,'03 - Schedule','10 - Master History',ss);
    archScheme.forEach(sheets => {
      moveDataRow(
        [].concat(...ss.getSheetByName(sheets.sourceSheet).getRange(sheets.srcColumn ':' sheets.srcColumn).getValues()).indexOf(orderNum)   1,
        sheets.sourceSheet,
        sheets.targetSheet,
        ss)
    })
  }
}
 

Комментарии:

1. Это ОТЛИЧНО работает. но как мне заставить мое условное форматирование двигаться вместе с ним?

2. еще один вопрос. ПРОСТИТЕ МЕНЯ, я старый программист Borland Delphi, и все это для меня НОВО….. у меня есть еще 2 листа, на которых все указано в рабочем задании #. как бы я поступил с тем же кодом, с которым вы помогли найти столбец текущей строки и использовать номер рабочего задания в качестве индекса на других листах и ПЕРЕМЕЩАТЬ или УДАЛЯТЬ их на других листах, как только задание завершено и соответствует критериям в этом текущем коде, который вы предоставили? Как только я вижу код, который работает, я анализирую его и вижу, как он работает, и именно так я учусь кодировать. я ОЧЕНЬ ВИЗУАЛЬНЫЙ человек.

3. Привет, @Рик Кроуэлл. Я не совсем понимаю ваш вопрос об условном форматировании. Если у вас есть некоторое условное форматирование на листе «03 — Расписание», то это правило условного форматирования не будет перенесено на целевой лист при перемещении строк. Вы также можете установить аналогичное правило условного форматирования на листе «10 — Основная история».

4. Что касается вашего второго вопроса, алгоритм следующий: при переносе строки из '03 - Schedule' в '10 - Master History' вам нужно ее обнаружить Work Order # . Затем прочитайте столбец с Рабочими заданиями из вашего листа, из которого вы хотите удалить/переместить строку с этим Рабочим заданием. Затем пробежитесь по массиву и найдите номер строки для перемещения. Затем вы можете использовать найденный номер строки для перемещения/удаления этой строки с рабочего листа. Если вы сделаете пример своей таблицы с несколькими строками данных — тогда я могу помочь вам построить код

5. вот копия листа : docs.google.com/spreadsheets/d/… если это помогает. 01 — мастер РО вступления лист будет один лист искали затем перенести найденные строки с (11 — история клиента) листа, а затем перенести найденные строки с (02 — сметной документации для завершения) в (13 — сметной истории)