2013-07-13 38 views
27

Tôi có trang tính có dữ liệu trong cols A qua H.Xác định hàng cuối cùng trong một cột đơn

Tôi cần xác định hàng cuối cùng trong cột A có chứa dữ liệu (tất cả đều tiếp giáp nhau - không có khoảng trống trong dữ liệu/hàng).

Ngoài ra còn có dữ liệu trong các cột khác có hơn hàng dữ liệu hơn cột A, vì vậy tôi cần cách ly chỉ cột A. (Và/hoặc chỉ là một phạm vi trong col A).

tôi có thể làm điều này trên mức bảng tính sử dụng

=COUNTA(A2:A100) 

Tuy nhiên trong tất cả các nghiên cứu của tôi cho một giải pháp Google Apps Script, tất cả tôi dường như thấy được yêu cầu để thực hiện nhiều chức năng bao gồm hàng chục dòng mã - bao gồm rất nhiều công cụ i++ ... Tôi có thể làm ít phức tạp hơn bằng cách bù trừ trực tiếp từ A1.

Có cách nào có thể sửa đổi phương pháp này theo cột cụ thể không?

var aLast = ss.getDataRange().getNumRows(); 

Nếu quá trình phức tạp là bắt buộc, thì hãy làm như vậy. Nhưng tôi thấy khó tưởng tượng (và thậm chí khó tìm hơn!) Một giải pháp đơn giản hơn.

Có ai quan tâm để khai sáng cho tôi (hoặc bật bong bóng của tôi) không?

Trả lời

63

Làm thế nào về việc sử dụng một thủ thuật JavaScript?

var Avals = ss.getRange("A1:A").getValues(); 
var Alast = Avals.filter(String).length; 

Tôi đã mượn ý tưởng này từ this answer. Phương thức Array.filter() hoạt động trên mảng Avals, chứa tất cả các ô trong cột A. Bằng cách lọc trên hàm tạo của hàm gốc, chúng tôi chỉ lấy lại các phần tử không null.

Tính năng này chỉ hoạt động cho một cột duy nhất; nếu phạm vi chứa nhiều cột, thì kết quả của filter() sẽ bao gồm các ô từ tất cả các cột và do đó nằm ngoài các thứ nguyên được phổ biến của phạm vi.

+4

Rất xảo quyệt. Tôi mong ngày tôi hiểu được javascript đủ để suy nghĩ sáng tạo như vậy. Tất cả trong thời gian tới, tôi cho là vậy. Tuy nhiên, trong khi chờ đợi, tôi rất thích nhìn theo cách bạn nghĩ. Và kudo để bạn trích dẫn nguồn cảm hứng cho giải pháp của bạn. Classy. Cảm ơn một lần nữa. – 5th4x4

+1

Một cái gì đó để chỉ ra rằng gần như chắc chắn là rõ ràng cho các lập trình viên có kinh nghiệm hơn là phạm vi không thể span nhiều hơn một cột duy nhất. Đây là điều mà tôi đã không nhận được, nhưng Mogsdad đã chỉ ra điều này trong một bình luận (đã bị xóa) rằng nó không thể kéo dài hơn một cột đơn. Một lần nữa, tôi chỉ muốn đặt điều này ở đây cho những người ở cấp độ kinh nghiệm của tôi và vẫn gặp khó khăn trong việc nắm bắt một số khái niệm. Cảm ơn, Mogsdad. – Soundfx4

+0

đây là những gì tôi cần, cảm ơn! – Jordan

7

Mặc dù không có công thức căng thẳng, tôi có thể nghĩ, nó không đòi hỏi hàng tá dòng mã để tìm ra hàng cuối cùng trong cột A. Hãy thử hàm đơn giản này. Sử dụng nó trong một tế bào theo cách thông thường bạn muốn sử dụng một số chức năng khác =CountColA()

function CountColA(){ 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var data = sheet.getDataRange().getValues(); 
    for(var i = data.length-1 ; i >=0 ; i--){ 
    if (data[i][0] != null && data[i][0] != ''){ 
     return i+1 ; 
    } 
    } 
} 
+0

lợi nhuận trên dòng cuối cùng của toàn bộ bảng tính, không col A. Tôi cần CHỈ hàng cuối cùng của col Một trong các hình thức của một biến để sử dụng trong kịch bản riêng của mình. Vì không có viên thuốc ma thuật cho điều này, tôi đoán tôi sẽ chỉ vòng xuống từ A1 cho đến khi tôi nhấn (trống) paydirt. Dù sao cũng cảm ơn bạn. – 5th4x4

+1

Xin lỗi, đó là một lỗi nhỏ từ phía tôi. Vui lòng xem tập lệnh đã sửa. – Srik

0

Chỉ cần sử dụng này:

// Để có được không các cột hoặc chỉ số cột cuối cùng của

var numColumns = sheet.getLastColumn()

// Để có được không có hàng hoặc chỉ mục của hàng cuối cùng

var numRows = sheet.getLastRow()

nơi,

var tờ = SpreadsheetApp.getActiveSheet()

+2

điều này xem toàn bộ trang tính, bao gồm các ô trống, không giống như những gì OP muốn. –

0

Tôi viết lại getLastRow/getLastColumn chức năng để xác định một chỉ số hàng hoặc chỉ số cột.

function get_used_rows(sheet, column_index){ 
     for (var r = sheet.getLastRow(); r--; r > 0) { 
     if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(r, column_index).getValue() != ""){ 
      return r; 
      break; 
     } 
     } 
    } 

function get_used_cols(sheet, row_index){ 
    for (var c = sheet.getLastColumn(); c--; c > 0) { 
    if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(row_index, c).getValue() != ""){ 
     return c; 
     break; 
    } 
    } 
} 
3

Bạn có thể làm điều này bằng cách đi ngược lại. Bắt đầu từ hàng cuối cùng trong bảng tính và đi lên cho đến khi bạn nhận được một số giá trị. Điều này sẽ làm việc trong tất cả các trường hợp ngay cả khi bạn có một số hàng trống ở giữa. Mã trông giống như dưới đây:

var iLastRowWithData = lastValue('A'); 
function lastValue(column) { 
    var iLastRow = SpreadsheetApp.getActiveSheet().getMaxRows(); 
    var aValues = SpreadsheetApp.getActiveSheet().getRange(column + "2:" + column + lastRow).getValues(); 

    for (; aValues[iLastRow - 1] == "" && iLastRow > 0; iLastRow--) {} 
    return iLastRow; 
} 
Các vấn đề liên quan