Di chuyển tập lệnh sang thời gian chạy V8

Môi trường thời gian chạy Rhino sẽ ngừng hoạt động từ ngày 31 tháng 1 năm 2026. Nếu có một tập lệnh hiện có đang sử dụng môi trường thời gian chạy Rhino, thì bạn phải di chuyển tập lệnh đó sang V8.

Thông thường, điều kiện tiên quyết duy nhất để thêm cú pháp và tính năng V8 vào một tập lệnh là bật môi trường thời gian chạy V8. Tuy nhiên, có một số ít trường hợp không tương thíchcác điểm khác biệt khác có thể khiến tập lệnh gặp lỗi hoặc hoạt động không như mong đợi trong môi trường thời gian chạy V8. Khi di chuyển một tập lệnh để sử dụng V8, bạn phải tìm kiếm các vấn đề này trong dự án tập lệnh và sửa mọi vấn đề mà bạn tìm thấy.

Quy trình di chuyển sang V8

Để di chuyển một tập lệnh sang V8, hãy làm theo quy trình sau:

  1. Bật môi trường thời gian chạy V8 cho tập lệnh. Bạn có thể kiểm tra runtimeVersion bằng cách sử dụng tệp kê khai cho dự án Google Apps Script.
  2. Xem kỹ các trường hợp không tương thích sau. Kiểm tra tập lệnh để xác định xem có trường hợp không tương thích nào hay không. Nếu có một hoặc nhiều trường hợp không tương thích, hãy điều chỉnh mã tập lệnh để xoá hoặc tránh vấn đề đó.
  3. Xem kỹ các điểm khác biệt khác sau. Kiểm tra tập lệnh để xác định xem có điểm khác biệt nào trong danh sách ảnh hưởng đến hành vi của mã hay không. Điều chỉnh tập lệnh để sửa hành vi.
  4. Sau khi sửa mọi trường hợp không tương thích hoặc các điểm khác biệt khác mà bạn phát hiện, hãy bắt đầu cập nhật mã để sử dụng cú pháp V8 và các tính năng khác.
  5. Sau khi hoàn tất việc điều chỉnh mã, hãy kiểm thử kỹ tập lệnh để đảm bảo tập lệnh hoạt động như mong đợi.
  6. Nếu tập lệnh của bạn là một ứng dụng web hoặc tiện ích bổ sung đã xuất bản , thì bạn phải tạo một phiên bản mới của tập lệnh có các điều chỉnh V8 và trỏ phiên bản triển khai đến phiên bản mới tạo. Để cung cấp phiên bản V8 cho người dùng, bạn phải xuất bản lại tập lệnh bằng phiên bản này.
  7. Nếu tập lệnh của bạn được dùng làm thư viện, hãy tạo một phiên bản triển khai mới của tập lệnh. Thông báo phiên bản mới này cho tất cả các tập lệnh và người dùng sử dụng thư viện của bạn, hướng dẫn họ cập nhật lên phiên bản hỗ trợ V8. Xác minh rằng mọi phiên bản cũ hơn dựa trên Rhino của thư viện đều không còn được sử dụng hoặc truy cập được.
  8. Xác minh rằng không có thực thể nào của tập lệnh vẫn đang hoạt động trên môi trường thời gian chạy Rhino cũ. Xác minh rằng tất cả các phiên bản triển khai đều được liên kết với một phiên bản trên V8. Lưu trữ các phiên bản triển khai cũ. Xem lại tất cả các phiên bản và xoá những phiên bản không sử dụng môi trường thời gian chạy V8.

Tính không tương thích

Môi trường thời gian chạy Apps Script ban đầu dựa trên Rhino không may cho phép một số hành vi ECMAScript không theo tiêu chuẩn. Vì V8 tuân thủ các tiêu chuẩn, nên những hành vi này không được hỗ trợ sau khi di chuyển. Nếu không sửa các vấn đề này, tập lệnh sẽ gặp lỗi hoặc hoạt động không đúng cách sau khi bật môi trường thời gian chạy V8.

Các phần sau đây mô tả từng hành vi này và các bước bạn phải thực hiện để sửa mã tập lệnh trong quá trình di chuyển sang V8.

Tránh for each(variable in object)

Câu lệnh for each (variable in object) đã được thêm vào JavaScript 1.6 và bị xoá để thay thế bằng for...of.

Khi di chuyển tập lệnh sang V8, hãy tránh sử dụng for each (variable in object) câu lệnh.

Thay vào đó, hãy sử dụng for (variable in object):

// Rhino runtime
var obj = {a: 1, b: 2, c: 3};

// Don't use 'for each' in V8
for each (var value in obj) {
  Logger.log("value = %s", value);
}
      
// V8 runtime
var obj = {a: 1, b: 2, c: 3};

for (var key in obj) {  // OK in V8
  var value = obj[key];
  Logger.log("value = %s", value);
}
      

Tránh Date.prototype.getYear()

Trong môi trường thời gian chạy Rhino ban đầu, Date.prototype.getYear() trả về năm có 2 chữ số cho các năm từ 1900 đến 1999, nhưng trả về năm có 4 chữ số cho các ngày khác. Đây là hành vi trong JavaScript 1.2 trở về trước.

Trong môi trường thời gian chạy V8, Date.prototype.getYear() trả về năm trừ đi 1900 thay vì theo yêu cầu của các tiêu chuẩn ECMAScript.

Khi di chuyển tập lệnh sang V8, hãy luôn sử dụng Date.prototype.getFullYear(), hàm này trả về năm có 4 chữ số bất kể ngày.

Tránh sử dụng các từ khoá dành riêng làm tên

ECMAScript cấm sử dụng một số từ khoá dành riêng trong tên hàm và tên biến. Môi trường thời gian chạy Rhino cho phép sử dụng nhiều từ trong số này. Vì vậy, nếu mã của bạn sử dụng các từ đó, thì bạn phải đổi tên hàm hoặc biến.

Khi di chuyển tập lệnh sang V8, hãy tránh đặt tên biến hoặc hàm bằng một trong các từ khoá dành riêng. Đổi tên mọi biến hoặc hàm để tránh sử dụng tên từ khoá. Các trường hợp sử dụng phổ biến của từ khoá làm tên là class, importexport.

Một ngoại lệ là các ký tự đối tượng được phép sử dụng từ khoá dành riêng (trong tất cả các môi trường thời gian chạy):

function class() {}     // Syntax error in V8.
var obj = { class: 1 }; // Allowed.

Tránh gán lại biến const

Trong môi trường thời gian chạy Rhino ban đầu, bạn có thể khai báo một biến bằng cách sử dụng const. Điều này có nghĩa là giá trị của ký hiệu không bao giờ thay đổi và các lần gán trong tương lai cho ký hiệu sẽ bị bỏ qua.

Trong môi trường thời gian chạy V8 mới, từ khoá const tuân thủ tiêu chuẩn và việc gán cho một biến được khai báo là const sẽ dẫn đến lỗi thời gian chạy TypeError: Assignment to constant variable.

Khi di chuyển tập lệnh sang V8, đừng cố gắng gán lại giá trị của biến const:

// Rhino runtime
const x = 1;
x = 2;          // No error
console.log(x); // Outputs 1
      
// V8 runtime
const x = 1;
x = 2;          // Throws TypeError
console.log(x); // Never executed
      

Tránh ký tự XML và đối tượng XML

Tiện ích không theo tiêu chuẩn này cho ECMAScript cho phép các dự án Apps Script sử dụng trực tiếp cú pháp XML.

Khi di chuyển tập lệnh sang V8, hãy tránh sử dụng ký tự XML trực tiếp hoặc đối tượng XML.

Thay vào đó, hãy sử dụng XmlService để phân tích cú pháp XML:

// V8 runtime
var incompatibleXml1 = <container><item/></container>;             // Don't use
var incompatibleXml2 = new XML('<container><item/></container>');  // Don't use

var xml3 = XmlService.parse('<container><item/></container>');     // OK
      

Không tạo hàm trình vòng lặp tuỳ chỉnh bằng __iterator__

JavaScript 1.7 đã thêm một tính năng cho phép thêm trình vòng lặp tuỳ chỉnh vào bất kỳ lớp nào bằng cách khai báo hàm __iterator__ trong nguyên mẫu của lớp đó. Tính năng này cũng được thêm vào môi trường thời gian chạy Rhino của Apps Script để giúp nhà phát triển thuận tiện hơn. Tuy nhiên, tính năng này chưa bao giờ là một phần của tiêu chuẩn ECMA-262 và đã bị xoá trong các công cụ JavaScript tuân thủ ECMAScript. Các tập lệnh sử dụng V8 không thể sử dụng cấu trúc trình vòng lặp này.

Khi di chuyển tập lệnh sang V8, hãy tránh sử dụng hàm __iterator__ để tạo trình vòng lặp tuỳ chỉnh. Thay vào đó, hãy sử dụng trình vòng lặp ECMAScript 6.

Hãy xem xét cấu trúc mảng sau:

// Create a sample array
var myArray = ['a', 'b', 'c'];
// Add a property to the array
myArray.foo = 'bar';

// The default behavior for an array is to return keys of all properties,
//  including 'foo'.
Logger.log("Normal for...in loop:");
for (var item in myArray) {
  Logger.log(item);            // Logs 0, 1, 2, foo
}

// To only log the array values with `for..in`, a custom iterator can be used.
      

Các ví dụ về mã sau đây cho thấy cách tạo trình vòng lặp trong môi trường thời gian chạy Rhino và cách tạo trình vòng lặp thay thế trong môi trường thời gian chạy V8:

// Rhino runtime custom iterator
function ArrayIterator(array) {
  this.array = array;
  this.currentIndex = 0;
}

ArrayIterator.prototype.next = function() {
  if (this.currentIndex
      >= this.array.length) {
    throw StopIteration;
  }
  return "[" + this.currentIndex
    + "]=" + this.array[this.currentIndex++];
};

// Direct myArray to use the custom iterator
myArray.__iterator__ = function() {
  return new ArrayIterator(this);
}


Logger.log("With custom Rhino iterator:");
for (var item in myArray) {
  // Logs [0]=a, [1]=b, [2]=c
  Logger.log(item);
}
      
// V8 runtime (ECMAScript 6) custom iterator
myArray[Symbol.iterator] = function() {
  var currentIndex = 0;
  var array = this;

  return {
    next: function() {
      if (currentIndex < array.length) {
        return {
          value: "[${currentIndex}]="
            + array[currentIndex++],
          done: false};
      } else {
        return {done: true};
      }
    }
  };
}

Logger.log("With V8 custom iterator:");
// Must use for...of since
//   for...in doesn't expect an iterable.
for (var item of myArray) {
  // Logs [0]=a, [1]=b, [2]=c
  Logger.log(item);
}
      

Trong môi trường thời gian chạy V8, bạn phải sử dụng for...of khi duyệt qua các mảng có trình vòng lặp tuỳ chỉnh, vì for..in không mong đợi các đối tượng có thể lặp lại.

Tránh mệnh đề catch có điều kiện

Môi trường thời gian chạy V8 không hỗ trợ mệnh đề catch có điều kiện catch..if vì chúng không tuân thủ tiêu chuẩn.

Khi di chuyển tập lệnh sang V8, hãy di chuyển mọi điều kiện catch vào bên trong phần nội dung catch:

// Rhino runtime

try {
  doSomething();
} catch (e if e instanceof TypeError) {  // Don't use
  // Handle exception
}
      
// V8 runtime
try {
  doSomething();
} catch (e) {
  if (e instanceof TypeError) {
    // Handle exception
  }
}

Tránh sử dụng Object.prototype.toSource()

JavaScript 1.3 chứa Object.prototype.toSource() chưa bao giờ là một phần của bất kỳ tiêu chuẩn ECMAScript nào. Phương thức này không được hỗ trợ trong môi trường thời gian chạy V8.

Khi di chuyển tập lệnh sang V8, hãy xoá mọi trường hợp sử dụng Object.prototype.toSource() khỏi mã của bạn.

Các điểm khác biệt khác

Ngoài các trường hợp không tương thích nêu trên có thể gây ra lỗi tập lệnh, còn có một số điểm khác biệt khác mà nếu không được sửa, có thể dẫn đến hành vi tập lệnh không mong muốn trong môi trường thời gian chạy V8.

Các phần sau đây giải thích cách cập nhật mã tập lệnh để tránh những điều bất ngờ không mong muốn này.

Điều chỉnh định dạng ngày và giờ dành riêng cho ngôn ngữ

Các Date phương thức toLocaleString(), toLocaleDateString(), và toLocaleTimeString() hoạt động khác nhau trong môi trường thời gian chạy V8 so với Rhino.

Trong Rhino, định dạng mặc định là định dạng dài và mọi tham số được truyền vào đều bị bỏ qua.

Trong môi trường thời gian chạy V8, định dạng mặc định là định dạng ngắn và các tham số được truyền vào sẽ được xử lý theo tiêu chuẩn ECMA (xem tài liệu toLocaleDateString() để biết thông tin chi tiết).

Khi di chuyển tập lệnh sang V8, hãy kiểm thử và điều chỉnh kỳ vọng của mã về kết quả của các phương thức ngày và giờ dành riêng cho ngôn ngữ:

// Rhino runtime
var event = new Date(
  Date.UTC(2012, 11, 21, 12));

// Outputs "December 21, 2012" in Rhino
console.log(event.toLocaleDateString());

// Also outputs "December 21, 2012",
//  ignoring the parameters passed in.
console.log(event.toLocaleDateString(
    'de-DE',
    { year: 'numeric',
      month: 'long',
      day: 'numeric' }));
// V8 runtime
var event = new Date(
  Date.UTC(2012, 11, 21, 12));

// Outputs "12/21/2012" in V8
console.log(event.toLocaleDateString());

// Outputs "21. Dezember 2012"
console.log(event.toLocaleDateString(
    'de-DE',
    { year: 'numeric',
      month: 'long',
      day: 'numeric' }));
      

Tránh sử dụng Error.fileNameError.lineNumber

Trong môi trường thời gian chạy V8, đối tượng JavaScript Error tiêu chuẩn không hỗ trợ fileName hoặc lineNumber làm tham số hàm khởi tạo hoặc thuộc tính đối tượng.

Khi di chuyển tập lệnh sang V8, hãy xoá mọi sự phụ thuộc vào Error.fileNameError.lineNumber.

Một lựa chọn thay thế là sử dụng Error.prototype.stack. Ngăn xếp này cũng không theo tiêu chuẩn, nhưng được hỗ trợ trong V8. Định dạng của dấu vết ngăn xếp do hai nền tảng tạo ra hơi khác nhau:

// Rhino runtime Error.prototype.stack
// stack trace format
at filename:92 (innerFunction)
at filename:97 (outerFunction)
// V8 runtime Error.prototype.stack
// stack trace format
Error: error message
at innerFunction (filename:92:11)
at outerFunction (filename:97:5)
      

Điều chỉnh cách xử lý các đối tượng enum được chuyển đổi thành chuỗi

Trong môi trường thời gian chạy Rhino ban đầu, việc sử dụng phương thức JavaScript JSON.stringify() trên một đối tượng enum chỉ trả về {}.

Trong V8, việc sử dụng cùng một phương thức trên một đối tượng enum sẽ trả về tên enum.

Khi di chuyển tập lệnh sang V8, hãy kiểm thử và điều chỉnh kỳ vọng của mã về kết quả của JSON.stringify() trên các đối tượng enum:

// Rhino runtime
var enumName =
  JSON.stringify(Charts.ChartType.BUBBLE);

// enumName evaluates to {}
// V8 runtime
var enumName =
  JSON.stringify(Charts.ChartType.BUBBLE);

// enumName evaluates to "BUBBLE"

Điều chỉnh cách xử lý các tham số không xác định

Trong môi trường thời gian chạy Rhino ban đầu, việc truyền undefined đến một phương thức dưới dạng tham số sẽ dẫn đến việc truyền chuỗi "undefined" đến phương thức đó.

Trong V8, việc truyền undefined đến các phương thức tương đương với việc truyền null.

Khi di chuyển tập lệnh sang V8, hãy kiểm thử và điều chỉnh kỳ vọng của mã về các tham sốundefined:

// Rhino runtime
SpreadsheetApp.getActiveRange()
    .setValue(undefined);

// The active range now has the string
// "undefined"  as its value.
      
// V8 runtime
SpreadsheetApp.getActiveRange()
    .setValue(undefined);

// The active range now has no content, as
// setValue(null) removes content from
// ranges.

Điều chỉnh cách xử lý this toàn cục

Môi trường thời gian chạy Rhino xác định một bối cảnh đặc biệt ngầm ẩn cho các tập lệnh sử dụng môi trường này. Mã tập lệnh chạy trong bối cảnh ngầm ẩn này, khác với this toàn cục thực tế. Điều này có nghĩa là các tham chiếu đến "this toàn cục" trong mã thực sự đánh giá đến bối cảnh đặc biệt, chỉ chứa mã và các biến được xác định trong tập lệnh. Các dịch vụ Apps Script tích hợp và đối tượng ECMAScript bị loại trừ khỏi việc sử dụng this này. Tình huống này tương tự như cấu trúc JavaScript sau:

// Rhino runtime

// Apps Script built-in services defined here, in the actual global context.
var SpreadsheetApp = {
  openById: function() { ... }
  getActive: function() { ... }
  // etc.
};

function() {
  // Implicit special context; all your code goes here. If the global this
  // is referenced in your code, it only contains elements from this context.

  // Any global variables you defined.
  var x = 42;

  // Your script functions.
  function myFunction() {
    ...
  }
  // End of your code.
}();

Trong V8, bối cảnh đặc biệt ngầm ẩn sẽ bị xoá. Các biến và hàm toàn cục được xác định trong tập lệnh được đặt trong bối cảnh toàn cục, bên cạnh các dịch vụ Apps Script tích hợp và các đối tượng ECMAScript tích hợp như MathDate.

Khi di chuyển tập lệnh sang V8, hãy kiểm thử và điều chỉnh kỳ vọng của mã về việc sử dụng this trong bối cảnh toàn cục. Trong hầu hết các trường hợp, sự khác biệt chỉ rõ ràng nếu mã của bạn kiểm tra các khoá hoặc tên thuộc tính của đối tượng this toàn cục:

// Rhino runtime
var myGlobal = 5;

function myFunction() {

  // Only logs [myFunction, myGlobal];
  console.log(Object.keys(this));

  // Only logs [myFunction, myGlobal];
  console.log(
    Object.getOwnPropertyNames(this));
}





      
// V8 runtime
var myGlobal = 5;

function myFunction() {

  // Logs an array that includes the names
  // of Apps Script services
  // (CalendarApp, GmailApp, etc.) in
  // addition to myFunction and myGlobal.
  console.log(Object.keys(this));

  // Logs an array that includes the same
  // values as above, and also includes
  // ECMAScript built-ins like Math, Date,
  // and Object.
  console.log(
    Object.getOwnPropertyNames(this));
}

Điều chỉnh cách xử lý instanceof trong thư viện

Việc sử dụng instanceof trong một thư viện trên một đối tượng được truyền dưới dạng tham số trong một hàm từ một dự án khác có thể cho kết quả âm tính giả. Trong môi trường thời gian chạy V8, một dự án và các thư viện của dự án đó được chạy trong các bối cảnh thực thi khác nhau và do đó có các biến toàn cục và chuỗi nguyên mẫu khác nhau.

Trường hợp này chỉ xảy ra nếu thư viện của bạn sử dụng instanceof trên một đối tượng không được tạo trong dự án của bạn. Việc sử dụng đối tượng đó trên một đối tượng được tạo trong dự án của bạn, cho dù ở cùng một tập lệnh hay một tập lệnh khác bên trong dự án của bạn, sẽ hoạt động như mong đợi.

Nếu một dự án đang chạy trên V8 sử dụng tập lệnh của bạn làm thư viện, hãy kiểm tra xem tập lệnh của bạn có sử dụng instanceof trên một tham số được truyền từ một dự án khác hay không. Điều chỉnh cách sử dụng instanceof và sử dụng các lựa chọn thay thế khả thi khác theo trường hợp sử dụng của bạn.

Một lựa chọn thay thế cho a instanceof b có thể là sử dụng hàm khởi tạo của a trong trường hợp bạn không cần tìm kiếm toàn bộ chuỗi nguyên mẫu và chỉ cần kiểm tra hàm khởi tạo. Cách sử dụng: a.constructor.name == "b"

Hãy xem xét Dự án A và Dự án B, trong đó Dự án A sử dụng Dự án B làm thư viện.

//Rhino runtime

//Project A

function caller() {
   var date = new Date();
   // Returns true
   return B.callee(date);
}

//Project B

function callee(date) {
   // Returns true
   return(date instanceof Date);
}

      
//V8 runtime

//Project A

function caller() {
   var date = new Date();
   // Returns false
   return B.callee(date);
}

//Project B

function callee(date) {
   // Incorrectly returns false
   return(date instanceof Date);
   // Consider using return (date.constructor.name ==
   // Date) instead.
   // return (date.constructor.name == Date) -> Returns
   // true
}

Một lựa chọn thay thế khác có thể là giới thiệu một hàm kiểm tra instanceof trong dự án chính và truyền hàm này ngoài các tham số khác khi gọi hàm thư viện. Sau đó, bạn có thể sử dụng hàm được truyền để kiểm tra instanceof bên trong thư viện.

//V8 runtime

//Project A

function caller() {
   var date = new Date();
   // Returns True
   return B.callee(date, date => date instanceof Date);
}

//Project B

function callee(date, checkInstanceOf) {
  // Returns True
  return checkInstanceOf(date);
}
      

Điều chỉnh việc truyền tài nguyên không dùng chung đến thư viện

Việc truyền tài nguyên không dùng chung từ tập lệnh chính đến thư viện hoạt động khác nhau trong môi trường thời gian chạy V8.

Trong môi trường thời gian chạy Rhino, việc truyền tài nguyên không dùng chung sẽ không hoạt động. Thay vào đó, thư viện sử dụng tài nguyên riêng.

Trong môi trường thời gian chạy V8, việc truyền tài nguyên không dùng chung đến thư viện sẽ hoạt động. Thư viện sử dụng tài nguyên không dùng chung được truyền.

Không truyền tài nguyên không dùng chung làm tham số hàm. Luôn khai báo tài nguyên không dùng chung trong cùng một tập lệnh sử dụng các tài nguyên đó.

Hãy xem xét Dự án A và Dự án B, trong đó Dự án A sử dụng Dự án B làm thư viện. Trong ví dụ này, PropertiesService là một tài nguyên không dùng chung.

// Rhino runtime
// Project A
function testPassingNonSharedProperties() {
  PropertiesService.getScriptProperties()
      .setProperty('project', 'Project-A');
  B.setScriptProperties();
  // Prints: Project-B
  Logger.log(B.getScriptProperties(
      PropertiesService, 'project'));
}

//Project B function setScriptProperties() { PropertiesService.getScriptProperties() .setProperty('project', 'Project-B'); } function getScriptProperties( propertiesService, key) { return propertiesService.getScriptProperties() .getProperty(key); }

// V8 runtime
// Project A
function testPassingNonSharedProperties() {
  PropertiesService.getScriptProperties()
      .setProperty('project', 'Project-A');
  B.setScriptProperties();
  // Prints: Project-A
  Logger.log(B.getScriptProperties(
      PropertiesService, 'project'));
}

// Project B function setProperties() { PropertiesService.getScriptProperties() .setProperty('project', 'Project-B'); } function getScriptProperties( propertiesService, key) { return propertiesService.getScriptProperties() .getProperty(key); }

Đề xuất JDBC trong môi trường thời gian chạy V8

Với môi trường thời gian chạy V8, chúng tôi đã thêm các tính năng mới vào dịch vụ JDBC.

Sử dụng executeBatch cho các thao tác hàng loạt

Sử dụng các thao tác executeBatch(params) để thực hiện các thao tác cơ sở dữ liệu hàng loạt.

Ví dụ sau đây cho thấy cách chèn nhiều hàng vào cơ sở dữ liệu bằng cách sử dụng tính năng xử lý hàng loạt:

Sau đây là môi trường thời gian chạy Rhino (phương thức cũ):

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://...");
var stmt = conn.prepareStatement("INSERT INTO employees (name, age) VALUES (?, ?)");
var params = [["John Doe", 30], ["John Smith", 25]];
for (var i = 0; i < params.length; i++) {
  stmt.setString(1, params[i][0]);
  stmt.setInt(2, params[i][1]);
  stmt.execute();
}

Sau đây là môi trường thời gian chạy V8 (phương thức mới):

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://...");
var stmt = conn.prepareStatement("INSERT INTO employees (name, age) VALUES (?, ?)");
var params = [["John Doe", 30], ["John Smith", 25]];
stmt.executeBatch(params);

Sử dụng getRows để tìm nạp tập kết quả

Sử dụng getRows(queryString) để tìm nạp dữ liệu tập kết quả trong một lệnh gọi. The queryString bao gồm các lệnh gọi được phân tách bằng dấu phẩy đến các phương thức getter của JdbcResultSet, ví dụ: "getString(1), getDouble('price'), getDate(3, 'UTC')". Các phương thức được hỗ trợ bao gồm tất cả các phương thức getter chịu trách nhiệm đọc dữ liệu cột, ví dụ: getHoldability, getMetaData, v.v. không được hỗ trợ. Các đối số có thể là chỉ mục cột số nguyên (dựa trên 1) hoặc nhãn cột chuỗi được trích dẫn đơn hoặc kép.

Ví dụ sau đây cho thấy cách tìm nạp các hàng từ tập kết quả:

Sau đây là môi trường thời gian chạy Rhino (phương thức cũ):

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://...");
var stmt = conn.createStatement();
var rs = stmt.executeQuery("SELECT name, age FROM employees");
while (rs.next()) {
  Logger.log(rs.getString('name') + ", " + rs.getInt('age'));
}

Sau đây là môi trường thời gian chạy V8 (phương thức mới):

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://...");
var stmt = conn.createStatement();
var rs = stmt.executeQuery("SELECT name, age FROM employees");
var rows = rs.getRows("getString('name'), getInt('age')");
for (var i = 0; i < rows.length; i++) {
  Logger.log(rows[i][0] + ", " + rows[i][1]);
}

Cập nhật quyền truy cập vào tập lệnh độc lập

Đối với các tập lệnh độc lập chạy trên môi trường thời gian chạy V8, bạn cần cung cấp cho người dùng ít nhất quyền xem tập lệnh để trình kích hoạt của tập lệnh hoạt động đúng cách.