Google スプレッドシートのカスタム関数で取得したデータを更新する 質問する

Google スプレッドシートのカスタム関数で取得したデータを更新する 質問する

idWeb サービスから情報 (価格) を受け取って取得するカスタム Google Apps Script を作成しました。

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

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

ベストアンサー1

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

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

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

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

したがって、関数を呼び出すたびに、追加のパラメータとして「$A$1」を渡します。また、更新というメニュー項目も作成しました。これを実行すると、現在の日付と時刻が 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)

価格を更新したい場合は、「更新」->「更新」メニュー項目をクリックするだけです。onOpen()スクリプトを変更した後は、スプレッドシートを再読み込みする必要があることに注意してください。

おすすめ記事