Hỏi cách tự động chuyển đến dòng dữ liệu cuối cùng khi chọn 1 spreadsheet

Liên hệ QC

feelingyes

Thành viên tiêu biểu
Tham gia
24/9/07
Bài viết
458
Được thích
395
Nghề nghiệp
Economic
Dear các anh chị

- Một spreadsheet có rất nhiều dữ liệu
- Mỗi lần mở spreadsheet, thanh cuộn thường scroll lên dòng trên cùng (mình sẽ phải cuộn xuống dưới hoặc nhấn phím tắt), để di chuyển xuống dòng dưới cùng

Em xin phép có cách nào để mỗi lần click chọn 1 spreadsheet, mình có thể auto chuyển đến dòng cuối cùng được không

P.s: Trong VBA em thấy có sự kiện worksheet acitve, mình rất dễ dàng để chọn được last row active ạ. Nhưng với spreadsheet không biết có được không?
 
Em không biết java, anh có thể thử giúp em một đoạn cho OnOpen(e) được không?

Em có google được một đoạn code, nhưng code này, nó chạy tít xuống dòng cuối cùng của sheet (chứ không phải là dòng cuối cùng của bảng dữ liệu)

Mã:
--------
/**
* When the spreadsheet is opened, activates the cell in
* column A of the last row that has data on every sheet.
*
* To take this script into use:
* 
*  - take a backup of your spreadsheet through File > Make a copy
*  - select all the text in this script, starting at the first "/**"
*    line above, and ending at the last "}"
*  - copy the script to the clipboard with Control+C (on a Mac, ⌘C)
*  - open the spreadsheet where you want to use the function
*  - choose Extensions > Apps Script (this opens a new tab)
*  - if you see just the 'function myFunction() {}' placeholder, press
*    Control+A (on a Mac, ⌘A), followed by Control+V (⌘V) to paste
*    the script in
*  - otherwise, click Files+ > Script, enter 'Jump to last row' to name
*    the file, and press Enter, Control+A (⌘A), Control+V (⌘V)
*  - if you have an existing onOpen(e) function, add the following line
*    as the first line after the initial '{' in that onOpen(e) function:
*      jumpToLastRow();
*    ...and then delete the onOpen(e) function below
*  - press Control+S (⌘S) to save the script
*  - when prompted, name the project 'Jump to last row in every sheet'
*  - the script will run automatically when you open the spreadsheet
*/

/**
* Simple trigger that runs each time the user opens the spreadsheet.
*
* @param {Object} e The onOpen() event object.
*/
function onOpen(e) {
  if (!e) {
    throw new Error('Please do not run the script in the script editor window. It runs automatically when you open the spreadsheet.');
  }
  jumpToLastRow();
}

/**
* Activates the first cell in the last row on every sheet.
*/
function jumpToLastRow() {
  // version 1.0, written by --Hyde 24 August 2021
// - @see https://support.google.com/docs/thread/122596329?msgid=122680143
// - @license https://hyde.mit-license.org/2021
  const sheets = SpreadsheetApp.getActive().getSheets();
  for (let s = sheets.length - 1; s >= 0; s--) {
    sheets[s].getRange(getLastRow_(sheets[s]), 1).activate();
    SpreadsheetApp.flush();
  }
}

/**
* Gets the position of the last row that has visible content in a column of the sheet.
* When column is undefined, returns the last row that has visible content in any column.
*
* @param {Sheet} sheet A sheet in a spreadsheet.
* @param {Number} columnNumber Optional. The 1-indexed position of a column in the sheet.
* @return {Number} The 1-indexed row number of the last row that has visible content.
*/
function getLastRow_(sheet, columnNumber) {
  // version 1.5, written by --Hyde, 4 April 2021
  const values = (
    columnNumber
      ? sheet.getRange(1, columnNumber, sheet.getLastRow() || 1, 1)
      : sheet.getDataRange()
  ).getDisplayValues();
  let row = values.length - 1;
  while (row && !values[row].join('')) row--;
  return row + 1;
}
 
Lần chỉnh sửa cuối:
Em vừa tìm được đoạn code dưới, cho vào AppScipt, và gán vào một button chạy rất ok

Mã:
function GoLastRow() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A:AC').createFilter();
  var criteria = SpreadsheetApp.newFilterCriteria().whenCellNotEmpty().build();
  var rg = spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(1, criteria).getRange();

  var row = rg.getNextDataCell (SpreadsheetApp.Direction.DOWN); 

  LastRow = row.getRow();

  spreadsheet.getActiveSheet().getFilter().remove();

  spreadsheet.getActiveSheet().getRange(LastRow+1, 1).activate();

};
 
Em vừa tìm thấy code chạy đến lastrow ở trên, nhưng hình như code chạy trên web diễn ra khá chậm so với VBA
Bạn thử code này thử xem.
Mã:
function GotoLastRow() {
  var spreadsheet = SpreadsheetApp.getActive();
  var lastR = LastRowHasData(spreadsheet, 'A');
  lastR.activate();
};

function LastRowHasData(ss, col){
  var cll = ss.getRange(col + ss.getLastRow());
  if (cll.isBlank()) {
    return cll.getNextDataCell(SpreadsheetApp.Direction.UP);
  } else {
    return cll;
  };
}
 
Ai viết Apps Script thường xuyên sẽ động tới lấy dòng cuối của cột khá nhiều.
Có vài cách xác định, ví dụ thế này.

JavaScript:
function getLastRow2(sh, sColRef_) {
  var lastRow = sh.getLastRow();
  var oRange  = sh.getRange(sColRef_ + lastRow);
  if (oRange.getValue() !== "") {
    return lastRow;
  } else {
    return oRange.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }          
}

function getLastRow(sh, sColRef_){
  /* sh: sheet object
     sColRef_: column name */
 
  var sColRef = sColRef_.toString() + ":" + sColRef_.toString();
  var dataColumn = sh.getRange(sColRef).getValues();
  var rowNum = 1;
  for(var row = dataColumn.length - 1; row > -1; row--){
     if(dataColumn[row][0] !== ""){
      rowNum = row + 1;
      break;
    };
  };
  return rowNum;
}

Áp dụng cho bài kia thì thế này..

JavaScript:
function jump2LastEmptyCellOfColumnA(){
  const strSheeetName = 'Sheet1';
  const sColRef       = 'A';
  var gs = SpreadsheetApp.getActiveSpreadsheet();
  var sh = gs.getSheetByName(strSheeetName);
  var lastRow  = getLastRow(sh, sColRef);
  var lastRow2 = getLastRow2(sh, sColRef);
  console.log('lastRow = ' + lastRow);
  console.log('lastRow2 = ' + lastRow2);
  sh.getRange(sColRef + (lastRow + 1)).activate();
}
 
Cám ơn 2 đại cao thủ : Anh Thắng và Anh Befaint, em test code chạy nhanh và rất ổn ạ
Em muốn tìm hiểu về code này, phải đọc cuốn nào anh ơi?
 
Web KT
Back
Top Bottom