ठीक है, ऐसा लगता है कि मेरी समस्या यह थी कि Google अजीब तरीके से व्यवहार करता है - यह स्क्रिप्ट को फिर से नहीं चलाता है जब तक स्क्रिप्ट पैरामीटर समान होते हैं, यह पिछले रन से कैश्ड परिणामों का उपयोग करता है। इसलिए यह एपीआई से फिर से कनेक्ट नहीं होता है और कीमत को फिर से प्राप्त नहीं करता है, यह बस पिछले स्क्रिप्ट परिणाम देता है जिसे कैश किया गया था।
अधिक जानकारी यहां देखें: https://code.google.com/p/google-apps-script-issues/issues/detail?==8
और यहां: डेटा को सारांशित करने के लिए स्क्रिप्ट अद्यतन नहीं
मेरा समाधान मेरी स्क्रिप्ट में एक और पैरामीटर जोड़ना था, जिसका मैं उपयोग भी नहीं करता। अब, जब आप फ़ंक्शन को पिछले कॉल से भिन्न पैरामीटर के साथ कॉल करते हैं, तो उसे स्क्रिप्ट को फिर से चलाना होगा क्योंकि इन मापदंडों के लिए परिणाम कैश में नहीं होगा।
इसलिए जब भी मैं फ़ंक्शन को कॉल करता हूं, तो अतिरिक्त पैरामीटर के लिए मैं "$ A $ 1" पास करता हूं। मैंने रिफ्रेश नामक एक मेनू आइटम भी बनाया, और जब मैं इसे चलाता हूं, तो यह ए 1 में वर्तमान तिथि और समय डालता है, इसलिए स्क्रिप्ट के सभी कॉल $ A $ 1 के साथ दूसरे पैरामीटर के रूप में पुनर्गणना करने होंगे। यहाँ मेरी स्क्रिप्ट से कुछ कोड है:
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();
}
और जब मैं एक सेल में आईडी 5 के साथ आइटम की कीमत डालना चाहता हूं, तो मैं निम्नलिखित सूत्र का उपयोग करता हूं:
=getPrice(5, $A$1)
जब मैं कीमतों को ताज़ा करना चाहता हूं, तो मैं बस "ताज़ा करें" -> "ताज़ा करें" मेनू आइटम पर क्लिक करता हूं। याद रखें कि onOpen()
स्क्रिप्ट बदलने के बाद आपको स्प्रेडशीट को फिर से लोड करना होगा ।