Перемещение строк между листами на основе редактирования ячейки + найденная пустая строка при поиске столбца, а не полная строка - PullRequest
0 голосов
/ 15 февраля 2019

Я работал над этим несколько дней и перевернул Интернет и эти форумы вверх ногами, но нигде не могу найти ответ.Я изучил некоторые сценарии на этом пути, но решил, что то, что мне нужно сделать, это далеко за пределами моих возможностей.Любая помощь или руководство будет СУПЕР хорошо принят !!

Я настраиваю систему листов заказов для «бизнеса» моей и моей жены ручной работы (проект).По сути, мне нужно переместить заказ 1 (столбцы aw) из «готово к отправке», когда «выполнено» введено в столбец X, в следующую пустую строку в «отправлено», исключив формулы в столбцах wz. Поэтому при проверке на наличиепустая строка, она должна проверять только столбцы aw.

Это означает, что после того, как информация о заказе переместилась на новый лист, в эти столбцы добавлена ​​дополнительная функциональность (я подключил ее, чтобы отправить электронное письмо с извинениями,если заказ опоздает - надеюсь, что нет, но лучше быть готовым с нашей почтовой службой :))

Пример листа здесь.

Изначально я научился какнапишите 'переместить строку, если значение добавлено в столбец x - и узнал о триггерах и о том, как вызывать листы и т. д.

Затем, поскольку в столбцах x, y и z есть формулы, я либо в конечном итоге удаляю их, когдапереместить всю строку - не круто. Или я получаю (если я перемещаю только столбцы a-w) новую (перемещенную) строку, отображающуюся в строке 9 миллионов, потому что она видит формулы как не пустые строки.Я редактировал сценарий «найти строку на основе столбца», который, казалось, работал нормально, но затем я попытался соединить их вместе, и тогда он взорвался.

Может кто-нибудь сказать мне, где я здесь не так?

function lastRowForColumn(sheet, column){
  // Get the last row with data for the whole sheet.
   var ss = spreadSheetApp.getActiveSpreadSheet();// this gets you the 
 active spreadsheet in which you are working   
   var sheet = ss.getSheetByName('Sent');
   var r = event.source.getActiveRange();
   var data = sheet.getRange(1, "A", numRows).getValues();
   var numRows = sheet.getLastRow();
  // Iterate backwards and find first non empty cell
  for(var i = data.length - 1 ; i >= 0 ; i--){
    if (data[i][0] != null && data[i][0] != ""){
    return i + 1;

     var ss = spreadSheetApp.getActiveSpreadSheet();// this gets you the 
      active spreadsheet in which you are working   
      var sheet = ss.getSheetByName('Sent');
      var r = event.source.getActiveRange();

        if(s.getName() == "Ready To Send" && r.getColumn() == 25 && 
    r.getValue() == "Sent") {
     var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Sent");
   var lastRow = lastRowForColumn();
    var target = targetSheet.getRange(targetSheet, i, 1);
    s.getRange(row, 1, 1, 10).moveTo(target);
   s.deleteRow(row);
   }
  }
  }
  }

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Эта функция принимает событие редактирования и проверяет, было ли измененное значение изменено на «Отправлено».Затем он копирует эту строку в отправленный лист в той же электронной таблице, сохраняя значения.

function onEdit(e){
  if(e.value != 'Sent') return false; //If not changed to 'Sent' then stop.

  var range = e.range; //get the range the edit occured in.
  if(range.getColumn() != 25) return false;//see if it was column number 25, ie. Column Y

  var sheet = range.getSheet();
  if(sheet.getName() != 'Ready To Send') return false;

  var editedRow = sheet.getRange(range.getRow(), 1, 1, sheet.getMaxColumns()); //Select the row.

  var sent = sheet.getParent().getSheetByName('Sent');
  sent.appendRow(editedRow.getValues()[0]);  //Copy row to Sent sheet.

  sheet.deleteRow(range.getRow()); //Deleted the original row
}
0 голосов
/ 15 февраля 2019

Попробуйте это:

function onEdit(e){
  var rg=e.range;
  var sh=rg.getSheet();
  var name=sh.getName();
  var col=rg.columnStart; 
  if(name!='Sheet To Send'){return;}
  if(col==24 && e.value=='done') {
    var ss=e.source;
    var sheet=ss.getSheetByName('Sent');
    var row=rg.rowStart;
    var srg=sh.getRange(row,1,1,23);
    var data=srg.getValues();
    var drg=sheet.getRange(sheet.getLastRow()+1,1,1,23);
    drg.setValues(data);
    sh.deleteRow(row);
  }
}
0 голосов
/ 15 февраля 2019

Я думаю, что вы хотите использовать getDisplayValues.Это решает и вашу проблему (формулы не являются пустой проблемой (убедитесь, что ваши формулы отображаются пустыми, когда строка не используется), а также проблема не переносит мои числа).

Попробуйте:

moveMe = [];
rowArray = s.getRange(row,1,1,10).getDisplayValues();
moveMe.push(rowArray);
targetSheet.appendRow(moveMe);
s.deleteRow(row);

Возможно, вам придется немного побороться с appendRow, но он самый чистый.Если это не работает как есть, попробуйте пропустить шаг push и выполнить

targetSheet.appendRow(rowArray);

ЛУЧШЕ (изменить):

Вам необходимо изменить первую строку данных на:

var data = sheet.getRange(1, "A", numRows).getDisplayValues();

и потом вы можете просто сделать:

targetSheet.appendRow(data[i]);
s.deleteRow(row);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...