112

idWeb サービス (価格) から情報を受け取り、取得するカスタム Google Apps スクリプトを作成しました。

このスクリプトをスプレッドシートで使用していますが、問題なく動作します。私の問題は、これらの価格が変更され、スプレッドシートが更新されないことです。

スクリプトを強制的に再実行してセルを更新するにはどうすればよいですか (手動で各セルを調べずに)。

4

20 に答える 20

111

わかりました、私の問題は、Googleが奇妙な方法で動作することだったようです-スクリプトパラメーターが類似している限り、スクリプトを再実行せず、以前の実行からキャッシュされた結果を使用します. したがって、API に再接続せず、価格を再フェッチせず、キャッシュされた以前のスクリプト結果を返すだけです。

ここで詳細情報を参照してください (影響を受けている場合は、これらの問題に星を追加してください):

Henrique G. Abreuの答え

私の解決策は、スクリプトに別のパラメーターを追加することでしたが、これは使用していません。以前の呼び出しとは異なるパラメーターを使用して関数を呼び出す場合、これらのパラメーターの結果がキャッシュにないため、スクリプトを再実行する必要があります。

したがって、関数を呼び出すときは常に、追加のパラメーターとして「$A$1」を渡します。また、refresh というメニュー項目も作成しました。これを実行すると、現在の日付と時刻が A1 に格納されるため、2 番目のパラメーターとして $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()スクリプトを変更した後、スプレッドシートをリロードする必要があることに注意してください。

于 2013-06-27T15:30:19.313 に答える
45

面倒なキャッシングバグ機能がありません。次のように動作します。

Google では、すべてのカスタム関数はパラメータ値のみに直接依存して結果を返すと見なしています (オプションで他の静的データに依存できます)。

この前提条件を考えると、パラメーターが変更された場合にのみ関数を評価できます。例えば

セル B1 にテキスト「10」があり、次に入力した他のセルにあるとします。=myFunction(B1)

myFunction が評価され、その結果が取得されます。次に、セル B1 の値を「35」に変更すると、カスタムが期待どおりに再評価され、新しい結果が正常に取得されます。ここで、セル B1 を元の「10」に再度変更すると、再評価は行われず、元の結果がキャッシュからすぐに取得されます。

そのため、シート名をパラメーターとして使用して動的に取得し、結果を返すと、キャッシュ ルールに違反しています。

残念ながら、この素晴らしい機能がなければカスタム関数を作成することはできません。そのため、シート名の代わりに値を直接受け取るように変更するか、カスタム関数を使用しないようにする必要があります。たとえば、スクリプトに集計の送信先を示すパラメータを設定しonEdit、合計が変化するたびに集計を更新することができます。

于 2012-01-26T19:21:45.090 に答える
8

NOW()自動的に更新できる設定があります。

ここに画像の説明を入力

于 2016-06-15T07:50:23.847 に答える
3

Google Finance 関数をパラメーターとして使用します。同様に =GOOGLEFINANCE("CURRENCY:CADARS")

これらの関数は x 分ごとに強制リロードされます

于 2019-09-21T19:54:28.547 に答える
2

Lexi のスクリプトをそのまま使用すると、現在のシートでは動作しないように見えましたが、ダミー変数をパラメーターとして関数に追加すると (関数内で実際に使用する必要はありません)、実際にGoogle シートに強制的にページを再度更新させます。

したがって、関数 myFunction(firstParam,dummy) のような宣言をしてから呼び出すことは、提案されているとおりです。それは私のために働いた。

また、編集するすべてのシートに確率変数が表示されるのが面倒な場合は、1 つのシートに制限する簡単な方法は次のとおりです。

function onEdit(e)
{
  e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}
于 2016-02-08T06:16:07.330 に答える
1

キャッシュの問題に対する別の解決策。

メソッドにダミー変数があります。合格

Filter(<the cell or cell range>,1=1)

そのパラメーターの値として。

例えば

=getValueScript("B1","B4:Z10", filter(B4:Z10,1=1))

filter の出力は使用されません。ただし、この数式が B4:Z10 の範囲に敏感であることをスプレッドシートに示します。

于 2014-03-21T16:33:29.350 に答える
1

仕事用のダッシュボードを作成する際にも同様の問題がありました。上記のChamilのソリューション(つまり、関数内のダミー変数に値として渡されたSheetのFilter関数を使用)は、Arsenからの最近のコメントにもかかわらず、うまく機能します. 私の場合、関数を使用して範囲を監視していましたが、循環参照が作成されたため、同じ範囲でフィルターを使用できませんでした。したがって、関数を更新したいときにいつでも番号を変更するセル(私の場合、以下のコードのE45)がありました。

=myFunction("E3:E43","D44",filter(E45,1=1))

Chamil が示したように、フィルターはスクリプトでは使用されません。

function myFunction(range, colorRef, dummy) {
  variable 'dummy' not used in code here
}
于 2016-01-27T21:05:04.127 に答える
0

Henrique Abreu によって説明されたその機能を考えると、すぐに使用できるスプレッドシート関数QUERYを試すことができます。その SQL 好きなクエリは、私が生データの作業でよく使用するものであり、別のタブへの要約としてデータを取得し、結果データが更新されます。生データの変化にリアルタイムで追従。

私の提案は、スクリプトが URL フェッチなどの高度な作業を行っておらず、データ作業のみを行っているという事実に基づいています。実際のデータを読み取らないと、QUERY で正確な解決策を提供することはできません。

Henrique Abreu が言及したキャッシュ機能について(彼の回答に直接コメントするほどの評判はありません)、テストを行ったところ、次のことがわかりました。

  1. 以下に示す関数のスクリプトをテストして、キャッシュが機能していないように見えます。

    function adder(base) { Utilities.sleep(5000); ベース + 10 を返します。}

セルを呼び出してそのカスタム関数 adder() をシートに適用し、読み込みメッセージと合計時間が 5 秒を超えるたびに、そのセルの値を前後に変更しました。これは、このGAS の問題で言及されている更新に関連している可能性があります。

この問題は修正されました。新しいシートのカスタム関数はコンテキストを認識し、積極的に値をキャッシュしなくなりました。

  1. このトピックで言及されている問題は残っています。私のテストでは、Google シートは毎回カスタム関数を再計算することが示唆されています。

    • 関数によって直接呼び出される値が変更されます。

    function getCellValue(sheetName,row,col) { var ss= SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getSheetByName(シート名); sh.getRange(row, col).getValue(); を返します。}

    ここに画像の説明を入力
    黄色のセルの値を変更すると、カスタム関数が再計算されます。実際のデータ ソース値の変更は関数によって無視されます。

    • セルの位置を含む関数がシートで変更されました。元。上または左側の行/列を挿入/削除します。
于 2017-02-16T13:37:19.317 に答える
0

できることは、新しいシートが追加されるたびに更新されるスプレッドシートのどこかに別のセルを設定することです。変更ごとに更新するのではなく、計算を実行したい場合にのみ更新するようにしてください(シートを追加する場合)。次に、このセルへの参照をカスタム関数に渡します。前述のように、カスタム関数はこのパラメーターを無視できます。

于 2015-01-20T04:38:23.253 に答える
-5

カスタム関数を作成し、それをスプレッドシートで数式として使用した場合、スプレッドシートを開くか参照セルが変更されるたびに、数式が再計算されます。

スプレッドシートを見つめ続け、その値を変更したい場合は、セルを更新する時限トリガーを追加することを検討してください。トリガーについて詳しくはこちら

于 2013-06-27T11:31:54.813 に答える