Ok, có vẻ như vấn đề của tôi là google hoạt động theo một cách kỳ lạ - nó không chạy lại tập lệnh miễn là các thông số tập lệnh tương tự nhau, nó sử dụng kết quả được lưu trong bộ nhớ cache từ các lần chạy trước. Do đó, nó không kết nối lại với API và không tìm nạp lại giá, nó chỉ trả về kết quả tập lệnh trước đó đã được lưu trong bộ nhớ cache.
Xem thêm thông tin tại đây: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
và đây: Tập lệnh tóm tắt dữ liệu không cập nhật
Giải pháp của tôi là thêm một tham số khác vào tập lệnh của tôi, mà tôi thậm chí không sử dụng. Bây giờ, khi bạn gọi hàm với một tham số khác với các lần gọi trước, nó sẽ phải chạy lại tập lệnh vì kết quả cho các tham số này sẽ không có trong bộ nhớ cache.
Vì vậy, bất cứ khi nào tôi gọi hàm, đối với tham số bổ sung, tôi chuyển "$ A $ 1". Tôi cũng đã tạo một mục menu có tên là refresh và khi tôi chạy nó, nó sẽ đặt ngày và giờ hiện tại ở A1, do đó tất cả các lệnh gọi tới tập lệnh có $ A $ 1 làm tham số thứ hai sẽ phải tính toán lại. Đây là một số mã từ tập lệnh của tôi:
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Refresh",
functionName : "refreshLastUpdate"
}];
sheet.addMenu("Refresh", entries);
};
function refreshLastUpdate() {
SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());
}
function getPrice(itemId, datetime) {
var headers =
{
"method" : "get",
"contentType" : "application/json",
headers : {'Cache-Control' : 'max-age=0'}
};
var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers);
var jsonObj = eval( '(' + jsonResponse + ')' );
return jsonObj.Price;
SpreadsheetApp.flush();
}
Và khi tôi muốn đặt giá của mặt hàng có ID 5 trong một ô, tôi sử dụng công thức sau:
=getPrice(5, $A$1)
Khi tôi muốn làm mới giá, tôi chỉ cần nhấp vào mục menu "Làm mới" -> "Làm mới". Hãy nhớ rằng bạn cần tải lại bảng tính sau khi thay đổi onOpen()
tập lệnh.