簡體   English   中英

Google表格未更新自定義函數返回值

[英]Google sheet not updating custom function return value

我對Google Apps腳本(以及JavaScript)非常陌生,但我一直在嘗試修補它以獲得樂趣。

我曾嘗試編寫一個腳本來獲取Google表格中的API價格數據,但在重新評估同一單元格中的腳本時,我發現返回的值沒有更新。

以下是從Coinbase API獲取比特幣價格數據的腳本。 腳本解析請求的JSON響應,如描述在這里

function getBTCPrice() {
  var url = "https://api.coinbase.com/v2/prices/BTC-USD/spot";
  var response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price
}  

現在,如果我在某個單元格中鍵入=getBTCPrice() ,然后稍后重新評估,我得到相同的價格; 但是,如果我在不同的單元格中評估腳本,我會得到不同的結果。

我已經閱讀了一些關於Google緩存單元格值的內容,因此可能不會評估腳本,因為單元格的值沒有改變。 這是這種情況嗎? 如果是這樣,有解決方法嗎?

任何幫助是極大的贊賞!

請查看有關Google電子表格中自定義函數檢索到的刷新數據的答案。

正如回答者所說,訣竅是

我的解決方案是在我的腳本中添加另一個參數,我甚至不使用它。 現在,當您使用與先前調用不同的參數調用該函數時,它將不得不重新運行該腳本,因為這些參數的結果將不在緩存中。

維克

除了Vikramaditya Gaonkar答案之外,您還可以使用可安裝的觸發器每分鍾獲得一次刷新結果。

function getBTCPrice(input) {  

  url = "https://api.coinbase.com/v2/prices/BTC-USD/spot";
  response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price

} 

function up(){

  SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());

}

在我的例子中,getBTCPrice函數的參數是每分鍾隨機化的單元格A1。 為此,我在up函數上創建了一個可安裝的觸發器

在此輸入圖像描述

功能,時間驅動,分鍾計時器,每分鍾

我終於想通了! 而不是嘗試從實際的表單元格(顯然存儲緩存的值)調用自定義函數,訣竅是在腳本中調用該函數。

使用我上面的腳本:

function getBTCPrice(url) {
  var response = UrlFetchApp.fetch(url);

  var jsonSpotPrice = response.getContentText();
  var parseSpotPrice = JSON.parse(jsonSpotPrice);
  var price = "$" + parseSpotPrice.data.amount;

  return price; 
}

然后,您可以從另一個腳本調用此函數。 具體來說,我希望將更新后的價格分配給單元格。 下面是一個示例,它將價格分配給活動電子表格,在單元格A1

function updatePrice(){
    var a = getBTCPrice("https://api.coinbase.com/v2/prices/BTC-USD/spot");
    SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(a);
}

然后,您可以繼續設置適當的時間觸發器。 這就是它的全部!

我也試圖讓我的自定義函數更新,搜索后我想出了以下函數:

function updateFormulas() {
  range = SpreadsheetApp.getActiveSpreadsheet().getDataRange();
  formulas = range.getFormulas();
  range.clear();
  SpreadsheetApp.flush();
  range.setValues(formulas);
}

上面的函數更新了電子表格的所有公式。 根據我制作自定義函數更新的經驗,我不得不更改其值,因此我獲取了工作表的所有數據,然后我獲取公式並將它們存儲到變量中,然后我清除它們的值並將此更改應用於“flush” “,最后我用我存儲的公式更新了剛剛清除的值。

我創建了這個函數,在我的情況下,我設置了1分鍾的觸發器來執行它,每一分鍾都會更新表的所有函數。

我希望這可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM