appendRow trả về [Ljava.lang.Object; @ thay vì giá trị

Sep 28 2020

Tôi muốn sao chép các bài gửi biểu mẫu sang một trang tính khác để có thể chỉnh sửa dữ liệu đã sao chép mà không ảnh hưởng đến các bài gửi ban đầu.

Tôi có mã sau:

function copy2(){
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("from");
  var tracker =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("to");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues();

  tracker.appendRow([null,row[0]]);

Sử dụng nulltrong appendRowgiúp bạn chuyển thông tin sang cột tiếp theo. Tuy nhiên, nó không hoàn toàn hoạt động với row[0]mảng. Nếu tôi xóa nullnó, nó hoạt động tốt, nhưng tôi muốn thông tin được sao chép trên một cột khác với cột đầu tiên.

Trả lời

3 Marios Sep 28 2020 at 18:30

Giải trình:

  • Cách tiếp cận sử dụng nullrõ ràng là một giải pháp thay thế và không phải là một giải pháp lâu dài. Cụ thể, nếu bạn muốn bắt đầu dán từ cột 4, bạn sẽ phải thực hiện [null,null,null,...row[0]], đây không phải là cách thích hợp để làm điều đó theo ý kiến ​​của tôi.
  • Tôi khuyên bạn nên loại bỏ appendRowvà nullvì bạn muốn dán dữ liệu từ cột thứ hai trở đi. Do đó, hãy sử dụng setValues()thay thế.

Thay thế:

tracker.appendRow([null,row[0]]);

với:

tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);


Giải pháp hoàn chỉnh:

function copy2(){
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("from");
  var tracker =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("to");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues(); 
  tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);
}
4 OlegValter Sep 28 2020 at 18:31

Tại sao lại sử dụng Ljava.lang.Object?

Vì bạn đang sử dụng thời gian chạy Rhino cũ hơn được viết bằng Java. Do đó, khi có điều gì đó bất ngờ xảy ra, bạn sẽ có cái nhìn thoáng qua về cơ sở hạ tầng mà GAS được xây dựng. Bây giờ, java.lang.objectlà một lớp cơ sở trong Java mà từ đó các đối tượng khác, bao gồm cả mảng, được dẫn xuất.

Vì appendRowtham số duy nhất của chữ ký phương thức chấp nhận mảng giá trị một chiều, của bạn row[0], chứa một mảng (xem getvaluesphương thức nào trả về), đã đưa nó vào trang tính dưới dạng thẻ chuỗi cho biết rằng đây là một đối tượng trong thời gian chạy.

Làm gì trong Rhino?

Tất cả các giải pháp phụ thuộc vào việc [ null ]như mảng cơ sở của bạn và sử dụng concatđể thêm phần còn lại của hàng đầu tiên, một cái gì đó như thế này: [ null ].concat(row[0]). Bạn cũng có thể sử dụng pushvới một forvòng lặp đơn giản để có hiệu suất tốt hơn.

Làm gì trong V8 0 ?

Như câu trả lời khác đã đề cập, đặt cược tốt nhất của bạn là cú pháp spread . Bạn cũng có thể thực hiện push(...row[0])để tránh nối các mảng (vì bạn sử dụng ngay và loại bỏ bản sao tạo ra từ đó [ null, ...row[0] ]).


0 Xem tài liệu chính thức về cách chuyển sang V8 để tận dụng các tính năng ngôn ngữ mới và tốc độ được cải thiện.

3 AmitAgarwal Sep 28 2020 at 18:18

Các rowbiến chứa một mảng, do đó bạn nên sử dụng các nhà điều hành lây lan vớiappendRow

Thay thế:

tracker.appendRow([null,row[0]]);

với:

tracker.appendRow([null,...row[0]]);

Đảm bảo rằng dự án của bạn được bật cho thời gian chạy Chrome V8.