【问题标题】:Google Apps Script - getLastRow where certain columns are emptyGoogle Apps 脚本 - 某些列为空的 getLastRow
【发布时间】:2020-08-23 11:19:46
【问题描述】:

我有以下 Google Apps 脚本,它从源工作表复制数据并将其粘贴到另一个工作表中。它当前查找目标工作表的最后一个空行和最后一个空列。我现在在目标表中的某些列中填充了公式来处理粘贴的数据。目标工作表列范围是 A:K,并且在 I:K 列中有公式。在有人可以帮我用新代码查找 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

在 Tanaike 的帖子之后,我在下面添加了他的函数 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 为空:

不想要的结果

源表和目标表的示例如下:

Sample Spreadsheet

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我相信你的目标如下。

    • 您有一张表,其中包含“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;
    }
    

    并且,为了在您的脚本中使用上述功能,请进行如下修改。

    从:
    var lastRow = target.getLastRow();
    
    到:
    var lastRow = getLastRow(target);
    
    • 这样,lastRow就可以在“A:H”范围内检索到了。

    参考:

    新增1:

    关于再修改一项,请测试以下修改。在您当前的脚本中,getLastRow(target) 检索到的lastRow 未被使用,valuesappendRow 附加到工作表的最后一行。所以为了使用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);

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多