#javascript #google-apps-script #google-sheets
Вопрос:
Я пытаюсь переместить строку с одного листа на основе критериев 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 — сметной истории)