Oke, sepertinya masalah saya adalah Google berperilaku aneh - tidak menjalankan ulang skrip selama parameter skrip serupa, ia menggunakan hasil yang di-cache dari proses sebelumnya. Oleh karena itu, ia tidak terhubung kembali ke API dan tidak mengambil kembali harga, ia hanya mengembalikan hasil skrip sebelumnya yang di-cache.
Lihat info lebih lanjut di sini: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
dan di sini: Skrip untuk meringkas data yang tidak diperbarui
Solusi saya adalah menambahkan parameter lain ke skrip saya, yang bahkan tidak saya gunakan. Sekarang, ketika Anda memanggil fungsi dengan parameter yang berbeda dari panggilan sebelumnya, itu harus menjalankan kembali skrip karena hasil untuk parameter ini tidak akan ada di cache.
Jadi setiap kali saya memanggil fungsi tersebut, untuk parameter tambahan saya mengirimkan "$ A $ 1". Saya juga membuat item menu yang disebut refresh, dan ketika saya menjalankannya, itu menempatkan tanggal dan waktu saat ini di A1, maka semua panggilan ke skrip dengan $ A $ 1 sebagai parameter kedua harus dihitung ulang. Berikut beberapa kode dari skrip saya:
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();
}
Dan ketika saya ingin memasukkan harga item dengan ID 5 di sel, saya menggunakan rumus berikut:
=getPrice(5, $A$1)
Ketika saya ingin menyegarkan harga, saya cukup mengklik item menu "Refresh" -> "Refresh". Ingatlah bahwa Anda perlu memuat ulang spreadsheet setelah Anda mengubah onOpen()
skrip.