web-dev-qa-db-ja.com

Googleスプレッドシートのカスタム関数によって取得されたデータを更新する

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

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

スクリプトを再実行してセルを更新するように強制するにはどうすればよいですか(各セルを手動で移動することなく)。

74
tbkn23

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

詳細はこちらをご覧ください: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888

そしてここ: 更新されていないデータを要約するスクリプト

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

したがって、関数を呼び出すたびに、追加のパラメーターに "$ 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()スクリプトを変更した後、スプレッドシートをリロードする必要があることに注意してください。

78
tbkn23

これは少し古い質問です。ただし、このメソッドでは、変更を加える以外のユーザーアクションは必要ありません。

私がしたことはtbkn23に似ていました。

再評価したい関数には、余分な未使用パラメーター$ A $ 1があります。したがって、関数呼び出しは

=myFunction(firstParam, $A$1)

しかし、コードでは関数のシグネチャは

function myFunction(firstParam)

Refresh関数を使用する代わりに、次のようなonEdit(e)関数を使用しました

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

この関数は、スプレッドシート内のセルが編集されるたびにトリガーされます。したがって、セルを編集すると、A1に乱数が配置され、tbkn23が示唆するようにパラメーターリストが更新され、カスタム関数が再評価されます。

32
Lexi Brush

これは非常に遅く、それが有用かどうかはわかりませんが、実際にはここで設定があり、NOW()を自動的に更新できます

enter image description here

12
Thaina

カスタム関数が特定の列内にある場合は、その列でスプレッドシートを並べるだけです。

順序付けにより、データの更新が強制され、その列のすべての行に対してカスタム関数が一度に呼び出されます。

4
flu

これは非常に古いスレッドかもしれませんが、今私がそうであったように、これを行おうとしている人にとっては役に立つかもしれません。

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

だから、次のような宣言:function myFunction(firstParam、dummy)そして、それを呼び出すことは提案された通りです。それは私のために働いた。

また、編集するすべてのシートにランダム変数が表示されるのが面倒な場合、1つのシートに制限する簡単な解決策は次のとおりです。

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

Webアプリをデプロイするたびに、同じバージョンが使用されます。それが更新されない理由です。

変更したら、[ファイル]-> [バージョンの管理]に移動し、新しいバージョンを保存します。新しいバージョンが表示されます。次に、デプロイするときに、実行するバージョンを選択します enter image description here

0
Azamat Mahkamov