id
を受け取り、Webサービス(価格)から情報を取得するカスタムGoogle Appsスクリプトを作成しました。Googleのカスタム機能で取得したデータを更新する
私はスプレッドシートでこのスクリプトを使用していますが、うまくいきます。私の問題は、これらの価格が変化し、私のスプレッドシートが更新されないということです。
スクリプトを再実行してセルを更新するにはどうすればよいですか(手動で各セルに移動する必要はありません)。
id
を受け取り、Webサービス(価格)から情報を取得するカスタムGoogle Appsスクリプトを作成しました。Googleのカスタム機能で取得したデータを更新する
私はスプレッドシートでこのスクリプトを使用していますが、うまくいきます。私の問題は、これらの価格が変化し、私のスプレッドシートが更新されないということです。
スクリプトを再実行してセルを更新するにはどうすればよいですか(手動で各セルに移動する必要はありません)。
私の問題は、Googleが奇妙なやり方で動作していたようだ - スクリプトパラメータが似ている限り、スクリプトを再実行しない、以前のキャッシュされた結果を使用する走るしたがって、APIに再接続せずに価格を再フェッチしないため、キャッシュされた以前のスクリプト結果が返されます。 Script to summarise data not updating
私のソリューションは、私も使用していない私のスクリプトに別のパラメータを追加しました:https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
、ここで:
は、ここに詳細情報を参照してください。今、以前の呼び出しとは異なるパラメーターで関数を呼び出すと、これらのパラメーターの結果がキャッシュにないため、スクリプトを再実行する必要があります。
私は関数を呼び出すたびに、余分なパラメータに対して "$ 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)
私はリフレッシュしたいとき価格、私は単に "リフレッシュ" - > "リフレッシュ"メニュー項目をクリックします。 onOpen()
スクリプトを変更した後にスプレッドシートを再読み込みする必要があることに注意してください。
now()を追加パラメータとして使用しないのはなぜですか? – Advanced
パラメータが変更されていないため(つまりセルの値)、関数が再評価されないように、now()はパラメータを持たないので再評価されません。戻り値変更されないので、関数のパラメータは変更されません。また、now()を使用すると、私の関数は常にいくつかのHTTP呼び出しを生成することを考えれば、少し重くなります。 – tbkn23
Good find。名前付き範囲を入力として使用しているときにこの問題が発生しました。あなたの答えを使って、行のB-Dがカスタム関数を参照している "sum(B:D)"のように、入力の範囲にダミーの合計を渡すのに十分なことが分かりました。セルを変更すると合計が変化し、カスタム関数が更新されます。ところで、カスタム関数は無視されたパラメータを宣言する必要さえないようです。 –
これは少し古い質問です。しかし、このメソッドは、変更を加えること以外はユーザーの操作を必要としません。
tbkn23と似ていました。
再評価したい機能には、余分なパラメータ$ A $ 1があります。だから、関数呼び出しは
=myFunction(firstParam, $A$1)
ですが、コード内の関数のシグネチャは、代わりに私がこの
function onEdit(e)
{
SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}
のようなのonEdit(e)の機能を使用しましたリフレッシュ機能を持っていることの
function myFunction(firstParam)
です
この関数は、スプレッドシート内のセルが編集されるたびにトリガーされます。これで、セルを編集し、A1に乱数を入れ、tbkn23が提案したようにパラメータリストを更新し、カスタム関数の再評価を行いました。
これはスーパー古いスレッドかもしれませんが、私が今のようにこれをやろうとしている人にとっては便利かもしれません。
Lexiのスクリプトをそのまま使用すると、現在のシートではうまく動作していないようですが、ダミー変数をパラメータとして関数に追加すると(実際に関数内で使用する必要はありません)それは実際にページを再びリフレッシュするようにGoogleシートを強制するでしょう。
したがって、function myFunction(firstParam、dummy)のように宣言してから、それを呼び出すようにします。それは私のために働いた。それはあなたが編集し、あなたのシートのすべてに表示される確率変数のために迷惑である場合は、次のよう
はまた、1枚に制限する簡単な救済策がある:
function onEdit(e)
{
e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}
これはほぼ同じですhttp://stackoverflow.com/a/27656313/1595451 –
@Rubénとても似ていますしかし、良い迷惑で。アクティブなシートを使用する代わりに、定義されたシート名を使用して履歴を改善します。 –
'NOW()'はカスタム関数ではなく、組み込み関数です。 –
@Rubénあなたが更新したい任意のカスタム関数にNOW()関数を含めることができる点です – Thaina
この時点で、カスタム関数の引数は決定論的でなければなりません。つまり、引数としてNOW()を使用しません。 https://developers.google.com/apps-script/guides/sheets/functions –
NOW()
更新を行うここが可能に設定されていますumn。
この並べ替えは、その列のすべての行に対してカスタム関数を呼び出すデータの更新を強制します。
はい、ここで説明しました:http://stackoverflow.com/questions/9022984/google-apps-script-to-summarise-data-not-updating/9023954#9023954 –
私の研究の一部。とても助かりました。ありがとう。私は私の答えにリンクを追加しました。 – tbkn23
類似した(論理的ではあるが、時には不幸な)動作に遭遇した場合は、Google Issue Tracker:https://issuetracker.google.com/issues/36763858でこの機能要求をupvoteすることをお勧めします。 –