1. ホーム
  2. google-apps-script

[解決済み] Google Sheetのカスタム関数で取得したデータをリフレッシュする

2022-09-24 18:43:29

質問

Google Appsのカスタムスクリプトを書きました。 id を受け取り、ウェブサービスから情報(価格)を取得します。

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

どうしたらスクリプトを再実行してセルを更新させることができますか (各セルを手動で確認せずに)。

どのように解決するのですか?

スクリプトのパラメータが類似している限り、スクリプトを再実行せず、前回実行したときのキャッシュされた結果を使用するのです。したがって、API に再接続することも、価格を再取得することもなく、単にキャッシュされた以前のスクリプト結果を返します。

詳細はこちらをご覧ください (影響を受ける場合は、これらの問題に星を付けてください)。

そして アンリケ・G・アブレウの回答

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

そこで、関数を呼び出すときはいつでも、追加のパラメーターに "$A$1" を渡します。 また、refresh というメニュー項目を作成し、それを実行すると、現在の日付と時刻が A1 に格納されます。したがって、$A$1 を 2 番目のパラメーターとするスクリプトのすべての呼び出しは、再計算される必要があります。以下は、私のスクリプトのコードです。

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)

価格を更新したいときは、単に "Refresh" -> "Refresh" メニュー項目をクリックするだけです。 を変更した後は、スプレッドシートを再読み込みする必要があることを忘れないでください。 onOpen() スクリプトを変更したら、スプレッドシートを再読み込みする必要があることを忘れないでください。