2012-05-09 48 views
19

Tôi đang sử dụng tập lệnh ứng dụng Google để ghi dữ liệu biểu mẫu vào bảng tính. Bây giờ tôi muốn lấy các giá trị từ Excel phù hợp với điều kiện (ví dụ, được lọc theo ngày tháng, tên người dùng) và hiển thị chúng với kịch bản ứng dụng.Truy xuất các hàng từ dữ liệu bảng tính bằng cách sử dụng tập lệnh ứng dụng google

bảng tính của tôi có

+-------------+-----------+----------------------+ 
| Date  | Username | Comment    | 
+-------------+-----------+----------------------+ 
| 2012-05-02 | palani | My first comment  | 
| 2012-05-02 | raja  | My second comment | 
| 2012-05-03 | palani | My third comment  | 
| 2012-05-03 | raja  | My fourth comment | 
+-------------+-----------+----------------------+ 

Bây giờ tôi muốn lọc dữ liệu cho 2012-05-02 ngày và raja vào tên người dùng và hiển thị chúng sử dụng nhãn trong app-script (được chạy như một dịch vụ web).

Tất cả tìm kiếm của tôi trả về giải pháp sử dụng SpreadsheetApp.getActiveSheet().getDataRange(); mà tôi nghĩ không được tối ưu hóa cách hiển thị một bản ghi trong số hơn 1000 hàng trong trang tính.

EDIT

Ngay bây giờ, tôi đang sử dụng chỉ .getValues(). Và dữ liệu được hiển thị ở đây là dành cho mẫu; trang tính thực sự của tôi hiện có 15 cột và 5000 hàng. Và cuối cùng nó sẽ tăng lên hàng triệu vì đây là một ứng dụng timesheet. Tôi tự hỏi có cách nào khác để getValues() của các hàng được lọc không?

Áp dụng =Filter công thức trên ô tmp cũng sẽ là một vấn đề, vì tập lệnh có thể được sử dụng đồng thời bởi số lượng người.

+1

Thật không may là không có cách nào getValues ​​với bộ lọc được áp dụng. Nhưng nếu dữ liệu của bạn tăng lên hàng triệu hàng, tập lệnh sẽ không phải là mối quan tâm chính của bạn vì bảng tính chỉ có thể chứa 400 nghìn ô. –

Trả lời

26

Cách đơn giản nhất, và một trong những tôi biết, là:
có được các giá trị trong một mảng sử dụng

var data = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); 

sau đó để thực hiện một vòng lặp

for (i in data) { 

trong vòng lặp này để kiểm tra nếu ngày (data[i][0]) bằng với số bạn đang tìm kiếm và nếu tên (data[i][1]) bằng với số bạn đang tìm kiếm. Và đẩy nó vào một mảng

var labels=new Array; 
label.push([data[i][0], data[i][1], data[i][2]]); 

sau đó có tất cả các dữ liệu của bạn trong mảng này, bạn có thể cư một Ui panen với nhãn sử dụng một vòng lặp for

for (i in labels) { ... 
+0

cảm ơn @cartman. Nhưng tôi có hàng ngàn hồ sơ và lặp lại nó có vẻ là giải pháp tồi. – palaniraja

+0

nó thực sự nhanh chóng mà bạn biết ... – Cartman

+0

Hàng ngàn hàng chắc chắn rất ít, đặc biệt chỉ với 3 cột. Bắt tất cả cùng một lúc với getValues ​​và looping là giải pháp ở đây. Trừ khi có điều gì đó chúng tôi không biết về dữ liệu hoặc việc sử dụng của bạn. ví dụ. bộ lọc tĩnh hoặc dữ liệu. –

4

Vâng, bạn có thể xem xét sử dụng một tế bào và sử dụng công thức "Truy vấn" trên đó. Giả sử Ngày tháng tại Cột A, Tên người dùng = Cột B, Chú thích là Cột C, trong khi ô trống là D1, tập lệnh của bạn sẽ trông giống như sau:

SpreadsheetApp.getActiveSheet().getRange("D1").setFormula('Query(A:C,"SELECT A,B,C WHERE B="' + "SomeOne'" + ',1)'; //filter the data and populate to D1 onwards  
SpreadsheetApp.getActiveSheet().getRange("D:F").getValues();//this is the filtered data 
Các vấn đề liên quan