google-apps-script google試算表排序 - 刷新Google表格中自定義功能檢索的數據




google試算表統計人數 如何使用google試算表 (6)

我編寫了一個自定義Google Apps腳本,它將從Web服務接收id和獲取信息(價格)。

我在電子表格中使用這個腳本,它工作得很好。 我的問題是這些價格會發生變化,我的電子表格也不會更新。

如何強制它重新運行腳本並更新單元格(無需手動遍歷每個單元格)?


Answers

我知道這是一個老問題。 但是,除了進行更改之外,此方法不需要任何用戶操作。

我所做的與tbkn23類似。

我想要重新評估的函數有一個額外的未使用參數,$ A $ 1。 所以函數調用是

=myFunction(firstParam, $A$1)

但在代碼中,函數簽名是

function myFunction(firstParam)

我沒有使用刷新功能,而是使用了像這樣的onEdit(e)函數

function onEdit(e)
{
   SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}

只要編輯電子表格中的任何單元格,就會觸發此功能。 所以現在編輯一個單元格,隨機數放在A1中,這會刷新參數列表,如tbkn23建議的那樣,導致自定義函數被重新評估。


這可能是一個超級老線程,但對於試圖這樣做的人來說可能很有用,就像我剛才那樣。

按原樣使用Lexi的腳本,它似乎不再適用於當前的Sheets,但是如果我將虛擬變量作為參數添加到我的函數中(不需要在函數內部實際使用它),它確實會強制谷歌工作表再次刷新頁面。

所以,聲明如:function myFunction(firstParam,dummy)然後調用它就像建議的那樣。 這對我有用。

此外,如果在您編輯的所有工作表上顯示隨機變量是一件麻煩事,那麼限制為一張工作表的簡單方法如下:

function onEdit(e)
{
  e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}

如果您已編寫自定義函數並在電子表格中將其用作公式,則每次打開電子表格或修改任何引用單元格時,都會重新計算公式。

如果您只想繼續盯著電子表格並希望其值發生變化,請考慮添加一個更新單元格的定時觸發器。 閱讀更多關於觸發器的here


如果您的自定義功能位於特定列中,只需按該列訂購電子表格即可。

排序強制刷新數據,同時為該列的所有行調用自定義函數。


好吧,似乎我的問題是google以一種奇怪的方式運行 - 只要腳本參數相似,它就不會重新運行腳本,它使用以前運行的緩存結果。 因此,它不會重新連接到API並且不會重新獲取價格,它只返回緩存的先前腳本結果。

在此處查看更多信息: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888https://code.google.com/p/google-apps-script-issues/issues/detail?id=888

在這裡: 腳本匯總數據不更新

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

因此,每當我調用該函數時,對於額外參數,我都會傳遞“$ A $ 1”。 我還創建了一個名為refresh的菜單項,當我運行它時,它將當前日期和時間放在A1中,因此所有對$ 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();
}   

當我想將ID為5的商品的價格放在單元格中時,我使用以下公式:

=getPrice(5, $A$1)

當我想刷新價格時,我只需點擊“刷新” - >“刷新”菜單項。 請記住,在更改onOpen()腳本後需要重新加載電子表格。






google-apps-script google-spreadsheet custom-function