#javascript #google-sheets
#javascript #google-sheets
Вопрос:
У меня возникли некоторые проблемы с расписанием магазина, которое я пытаюсь настроить. Я хотел бы, чтобы вся строка была перемещена на соответствующую новую вкладку, когда определенные данные вводятся в столбец «J». Я включил редактируемую ссылку на созданный мной образец листа, который также помогает объяснить, что я пытаюсь сделать.
Если возможно, было бы также полезно иметь возможность изменять цвета фона на листе образца.
Спасибо!
Редактируемая ссылка: https://docs.google.com/spreadsheets/d/1D0iptPchrrLuq75ysvXwisBa_Xr0fuNabAdTb3sm-yA/edit?usp=sharing
Комментарии:
1. Вы хотите, чтобы они были скопированы или полностью перемещены на другой лист? Что вы уже пробовали?
2. Это не сложно. Сделал копию вашего листа и работаю над сценарием, который бы это делал
Ответ №1:
Это грубый код, который будет работать, однако, если вы измените значение на то же, что оно включено (так что, если оно завершено, и вы отредактируете его, чтобы изменить на 20), он просто удалит строку. Это было бы легко исправить, но сейчас у меня просто нет времени 🙂
РЕДАКТИРОВАТЬ: просто не забыл отметить, что он будет использовать последнюю строку, поэтому для возврата к назначениям вы должны переместить легенду в начало листа 🙂 Или вы должны просто полностью избавиться от бита возврата к назначениям. Вы также можете поиграть с тем, как работают с переменными, мне просто не нравится снова захватывать листы, поэтому я отправляю их много в функцию перемещения.
function onEdit(e) {
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); //get active spreadsheet
var srcSheet = spreadSheet.getActiveSheet(); //get active sheet
var editCol = e.range.getColumn(); //check the edited column
if (editCol!==10) {return} //if the edited column is not J then we don't need to do anything else
var srcLastCol = srcSheet.getLastColumn(); //check how large is our data range
var srcRow = srcSheet.getRange(e.range.getRow(), 1, 1, srcLastCol); //get the source row range
var srcVals = srcRow.getValues(); //get the values from the source fow
var destSheet, destRow, destRange; //destination variables
Logger.log(e.value)
if (e.value>=1 amp;amp; e.value<=14) { //for 1-14 we use we assign 1 sheet, the same function for everything
moveRow('In Shop', srcRow, srcVals, srcLastCol, spreadSheet);
}
else { //for everything else we use a switch
switch(e.value) {
case '15':
moveRow('Arrive / In Lot', srcRow, srcVals, srcLastCol, spreadSheet);
break;
case '17':
moveRow('Waiting on Parts, Truck, Etc.', srcRow, srcVals, srcLastCol, spreadSheet);
break;
case '20':
moveRow('Completed', srcRow, srcVals, srcLastCol, spreadSheet);
break;
default :
moveRow('Appointments', srcRow, srcVals, srcLastCol, spreadSheet);
}
}
}
function moveRow(destName, srcRow, srcVals, srcLastCol, spreadSheet) {
var destRow
var destSheet = spreadSheet.getSheetByName(destName)
destRow = destSheet.getLastRow() 1;
destSheet.getRange(destRow, 1, 1, srcLastCol).setValues(srcVals)
srcRow.clear()
}
РЕДАКТИРОВАНИЕ 2
Ответы на комментарии
function moveRow(destName, srcRow, srcVals, srcLastCol) {
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
var destRow
var destSheet = spreadSheet.getSheetByName(destName)
destRow = destSheet.getLastRow() 1;
destSheet.getRange(destRow, 1, 1, srcLastCol).setValues(srcVals)
srcRow.clear()
}
Однако это было бы плохой практикой для любого более крупного скрипта с длительным временем выполнения. Тогда вы каждый раз будете тратить время на доступ к SpreadsheetApp.
Что касается цветов, это довольно простая настройка в moveRow():
function moveRow(destName, srcRow, srcVals, srcLastCol, spreadSheet) {
var destRow
var destSheet = spreadSheet.getSheetByName(destName);
destRow = destSheet.getLastRow() 1;
var destRange = destSheet.getRange(destRow, 1, 1, srcLastCol);
destRange.setValues(srcVals);
destRange.setBackground(destSheet.getTabColor())
srcRow.clear()
}
Что касается сортировки, это то, что вам нужно иметь destSheet = spreadSheet.getSheetByName(destName);
перед вызовом moveRow() . Итак, ниже, давайте предположим, что вы извлекаете destSheet где-то перед if
or в if
самом. В этом примере он будет отсортирован по столбцу A в порядке возрастания (поэтому настройте 1 на то, что вам нужно, допустим, вы хотите J, тогда это будет 10)
if (e.value>=1 amp;amp; e.value<=14) {
moveRow('In Shop', srcRow, srcVals, srcLastCol, spreadSheet);
destSheet.sort(1)acceding order
}
Комментарии:
1. Витаутас, это здорово работает! Спасибо! Еще один вопрос: как бы я мог изменить фон на соответствующие цвета в зависимости от того, на какой вкладке он находится? Кроме того, должны ли те, что указаны для «В магазине», автоматически сортироваться численно? Кроме того, что вы подразумеваете под повторным захватом листов и какие переменные я бы попытался изменить? Извините за все вопросы. Я все еще с трудом понимаю, как работают скрипты: (
2. Недостаточно символов, и форматирование будет ужасным, чтобы объяснить все здесь. Я бы настоятельно рекомендовал вам начать использовать ссылку , так как за ней очень легко следить (просто нажмите на возвращаемый тип и следуйте каждой нужной вам функции). Что касается захвата листов, для каждого
spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
потребуется время, поэтому вместо того, чтобы функция выполняла это действие снова, я просто отправляю ссылку на объект из основной функции в moveRow() , поэтому мне не нужно делать это снова и тратить время на выполнение3. Хорошо, спасибо. Единственная проблема, которую я вижу сейчас, — это когда я помещаю что-то в «In Shop», как только я добавлю еще один, он удалит и заменит тот, который уже был там. Даже если цифры разные. Спасибо за вашу помощь!
4. Я думаю, это происходит потому, что я не помещаю скрипт «сортировки» в нужную область? Кроме того, есть ли способ, чтобы ничего не произошло, если будут введены какие-либо другие числа, кроме упомянутых. Мне просто интересно, потому что случайно вводится число, которого нет в коде, эта строка информации, похоже, стерта или куда-то перемещена? Таким образом, в принципе, если вводится что-либо, кроме 15, 17, 20, информация остается в «Назначении». Хотя я думал, что это уже настроено с использованием ‘default: moveRow(‘Встречи’, srcRow, srcVals, srcLastCol, электронная таблица); }’
5. Примечание: не оставляйте в коде 2 функции с одинаковым именем. Да, вы можете ограничить это. Как я уже сказал, это базовый код, который я собрал за пару минут. Вам просто нужно указать else. В этой ситуации вы можете просто использовать switch. Прочитайте, как использовать несколько критериев здесь Удаление происходит из-за моей ошибки в коде. Я отредактирую его. По сути, в функции moveRow изменить
if (destRow === 0) {destRow }
на простоdestRow
или изменитьdestRow = destSheet.getLastRow() 1