Скрипт Google Apps - getLastRow, где определенные столбцы пусты - PullRequest
1 голос
/ 08 мая 2020

У меня есть следующий скрипт Google Apps, который копирует данные из исходного листа и вставляет их на другой лист. В настоящее время он ищет последнюю пустую строку и последний пустой столбец целевого листа. Теперь у меня есть определенные столбцы на целевом листе, заполненные формулой для работы с вставленными данными. Диапазон столбцов целевого листа - A: K, в столбцах I: K содержится формула. in Может ли кто-нибудь помочь мне с новым кодом найти последнюю строку, в которой столбцы A: H пусты?

function onEdit(e) {
  var spreadsheet = e.source;
  var sheet = spreadsheet.getActiveSheet();
  var sourcesheetname = "SOP Register"
  var range = e.range;
  var sheet = range.getSheet();
  var row = range.getRow();
  var column = range.getColumn();
  var editedColumn = range.getColumn();
  var editedRow = range.getRow();
  var column = 7;
  var date = range.getValue();
  if(Object.prototype.toString.call(date) === '[object Date]' && editedColumn == column && editedRow > 2 && sheet.getName() == sourcesheetname) {
    var targetsheetname = "Internal Audit Register";
    var target = e.source.getSheetByName(targetsheetname);
    var numCols = sheet.getLastColumn();
    var values = sheet.getRange(row, 1, 1, numCols).getValues()[0];
    values.splice(9) //Up to and including column I
    values.splice(7, 1) //Remove column H
    values.splice(2, 3); //Keep columns all columns and leave out columns C, D & E 
    var lastRow = target.getLastRow();
    var lastCol = target.getLastColumn();
    values.unshift("SOP"); //Append "SOP" to column A
    target.appendRow(values); // Append new row  
    sheet.hideColumns(6,2);}}//End of onEdit Functions

После сообщения Танаике я добавил его функцию getLastRow (sheet) и весь мой скрипт onEdit (e) ниже:

function getLastRow(sheet) {
  const values = sheet.getRange("A1:H" + sheet.getLastRow()).getDisplayValues();
  let lastRow = 0;
  for (let r = values.length - 1; r >= 0 ; r--) {
    if (!lastRow && !values[r].every(e => e == "")) {
      lastRow = r + 1;
      break
    }
  }
  return lastRow;
}

// Cut Employees Left from Unit Standards sheet and paste in Unit Standards - Employees Left sheet
function onEdit(e) {
  var ss = e.source;
  var sheet = ss.getActiveSheet();
  var sheetName = "Unit Standards"
  var range = e.range;
  var editedColumn = range.getColumn();
  var editedRow = range.getRow();
  var column = 4;
  var date = range.getValue();
  // Object.prototype.toString.call(date) === '[object Date]' --> checks if value is date
  // editedColumn == column && editedRow > 4 --> checks if edited cell is from 'Date Left'
  // sheet.getName() == sheetName --> checks if edited sheet is 'Unit Standards'
  if(Object.prototype.toString.call(date) === '[object Date]' && editedColumn == column && editedRow > 4 && sheet.getName() == sheetName) {
    var numCols = sheet.getLastColumn();
    var row = sheet.getRange(editedRow, 1, 1, numCols).getValues();
    var destinationSheet = ss.getSheetByName("Unit Standards - Employees Left");
    // Get first empty row:
    var emptyRow = destinationSheet.getLastRow() + 1;
    // Copy values from 'Unit Standards'
    destinationSheet.getRange(emptyRow, 1, 1, numCols).setValues(row);
    sheet.deleteRow(editedRow);
    sheet.hideColumns(column); }
  
// Copy and paste from Events/Incidents sheet to Vehicle Damage sheet
 {var range = e.range;
  var sheet = range.getSheet();
  var row = range.getRow();
  var column = range.getColumn();
  var sourcesheetname = "Events/Incidents";
  var checkbox = range.getValue();
  if (sheet.getName() == sourcesheetname && column == 25 && row > 2 && checkbox == true) {
    var targetsheetname = "Vehicle Damage";
    var target = e.source.getSheetByName(targetsheetname);
    var numCols = sheet.getLastColumn();
    var values = sheet.getRange(row, 1, 1, numCols).getValues()[0];
    values.splice(17)
    values.splice(8, 8)
    values.splice(5, 1)
    values.splice(3, 1); // Removing undesired values
    var lastRow = target.getLastRow();
    var lastCol = target.getLastColumn();
    target.appendRow(values); }// Append new row   

//SOP Internal Audit Required CheckBox if True
 {var range = e.range
  var sheet = range.getSheet();
  var row = range.getRow();
  var column = range.getColumn();
  var sourcesheetname = "SOP Register";
  var checkbox = range.getValue();
  if (sheet.getName() == sourcesheetname && column == 5 && row > 2 && checkbox == true) {
    sheet.showColumns(6,2);
    sheet.getRange("F3").activate();}

// Copy and paste from SOP Register sheet to Internal Audit sheet
 {var spreadsheet = e.source;
  var sheet = spreadsheet.getActiveSheet();
  var sourcesheetname = "SOP Register"
  var range = e.range;
  var sheet = range.getSheet();
  var row = range.getRow();
  var column = range.getColumn();
  var editedColumn = range.getColumn();
  var editedRow = range.getRow();
  var column = 7;
  var date = range.getValue();
  if(Object.prototype.toString.call(date) === '[object Date]' && editedColumn == column && editedRow > 2 && sheet.getName() == sourcesheetname) {
    var targetsheetname = "Internal Audit Register";
    var target = e.source.getSheetByName(targetsheetname);
    var numCols = sheet.getLastColumn();
    var values = sheet.getRange(row, 1, 1, numCols).getValues()[0];
    values.splice(9) //Up to and including column I
    values.splice(7, 1) //Remove column H
    values.splice(2, 3); //Keep columns all columns and leave out columns C, D & E 
    var lastRow = getLastRow(target);
    var lastCol = target.getLastColumn();
    values.unshift("SOP"); //Append "SOP" to column A
    target.appendRow(values); // Append new row  
    sheet.hideColumns(6,2);}}}}}//End of onEdit Functions

Это мой желаемый результат, и я вставляю новые данные в ячейки A5: F5, но текущий скрипт вставляет их в ячейки A6: F6 и ячейки I6: K6 пустые :

enter image description here

Нежелательный результат

enter image description here

Образец источника лист и целевой лист приведены ниже:

Образец электронной таблицы

1 Ответ

2 голосов
/ 08 мая 2020

Я считаю, что ваша цель следующая.

  • У вас есть лист со значениями в столбцах от «A» до «K». А столбцы от «I» до «K» имеют формулы.
  • Вы хотите получить номера последней строки в диапазоне «A: H».

Для этого как насчет этого ответа? В этом ответе я готовлю функцию для получения последней нужной вам строки.

Измененный скрипт:

Добавьте следующую функцию. Эта функция возвращает значения lastRow путем ввода объекта листа.

function getLastRow(sheet) {
  const values = sheet.getRange("A1:H" + sheet.getLastRow()).getDisplayValues();
  let lastRow = 0;
  for (let r = values.length - 1; r >= 0 ; r--) {
    if (!lastRow && !values[r].every(e => e == "")) {
      lastRow = r + 1;
      break
    }
  }
  return lastRow;
}

И, чтобы использовать указанную выше функцию в вашем скрипте, измените следующее.

From:
var lastRow = target.getLastRow();
To :
var lastRow = getLastRow(target);
  • Таким образом, lastRow может быть получено в диапазоне "A: H".

Ссылка:

Добавлено 1:

По поводу еще одной модификации, пожалуйста, протестируйте следующую модификацию. В вашем текущем скрипте lastRow, полученный getLastRow(target), не используется, а values добавляется к последней строке листа appendRow. Поэтому, чтобы использовать lastRow, измените следующее. В этом случае в обновленном вопросе измените getRange("A1:H" + sheet.getLastRow()) на getRange("A1:F" + sheet.getLastRow()) для функции getLastRow.

От:

var lastRow = getLastRow(target);
var lastCol = target.getLastColumn();
values.unshift("SOP"); //Append "SOP" to column A
target.appendRow(values); // Append new row  

Кому:

var lastRow = getLastRow(target);
var lastCol = target.getLastColumn();
values.unshift("SOP");
target.getRange(lastRow + 1, 1, 1, values.length).setValues([values]);  // Modified

Добавлено 2:

  1. У вас есть лист со значениями в столбцах от «A» до «K». А столбцы от «I» до «K» имеют формулы.
  2. Вы хотите получить номера последней строки в диапазоне «A: H».
  3. А также , вы хотите скопировать формулы столбцов «I» в «K» в ту же строку, в которой помещаются значения.

Для этого измените сценарий следующим образом. В этом случае используйте getLastRow().

От:

var lastRow = getLastRow(target);
var lastCol = target.getLastColumn();
values.unshift("SOP"); //Append "SOP" to column A
target.appendRow(values); // Append new row  

Кому:

var lastRow = getLastRow(target);
var lastCol = target.getLastColumn();
values.unshift("SOP");
target.getRange(lastRow + 1, 1, 1, values.length).setValues([values]);  // Modified
if (lastRow >= 3) target.getRange(lastRow, 9, 1, 3).copyTo(target.getRange(lastRow + 1, 9, 1, 3), SpreadsheetApp.CopyPasteType.PASTE_FORMULA);  // Added
  • В этом случае, по крайней мере, требуется, чтобы в строке 3 были формулы в столбцах от «I» до «K».
  • Если в строке 3 наверняка есть формулы в столбцах от «I» до «K», я думаю, что вы также можно использовать if (lastRow >= 3) target.getRange(3, 9, 1, 3).copyTo(target.getRange(lastRow + 1, 9, 1, 3), SpreadsheetApp.CopyPasteType.PASTE_FORMULA);.
...