Скрипт для Google Таблиц для перемещения строки на новый лист

#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