2013-06-27 14 views
55

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

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

スクリプトを再実行してセルを更新するにはどうすればよいですか(手動で各セルに移動する必要はありません)。

+1

はい、ここで説明しました:http://stackoverflow.com/questions/9022984/google-apps-script-to-summarise-data-not-updating/9023954#9023954 –

+0

私の研究の一部。とても助かりました。ありがとう。私は私の答えにリンクを追加しました。 – tbkn23

+0

類似した(論理的ではあるが、時には不幸な)動作に遭遇した場合は、Google Issue Tracker:https://issuetracker.google.com/issues/36763858でこの機能要求をupvoteすることをお勧めします。 –

答えて

54

私の問題は、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()スクリプトを変更した後にスプレッドシートを再読み込みする必要があることに注意してください。

+3

now()を追加パラメータとして使用しないのはなぜですか? – Advanced

+5

パラメータが変更されていないため(つまりセルの値)、関数が再評価されないように、now()はパラメータを持たないので再評価されません。戻り値変更されないので、関数のパラメータは変更されません。また、now()を使用すると、私の関数は常にいくつかのHTTP呼び出しを生成することを考えれば、少し重くなります。 – tbkn23

+1

Good find。名前付き範囲を入力として使用しているときにこの問題が発生しました。あなたの答えを使って、行のB-Dがカスタム関数を参照している "sum(B:D)"のように、入力の範囲にダミーの合計を渡すのに十分なことが分かりました。セルを変更すると合計が変化し、カスタム関数が更新されます。ところで、カスタム関数は無視されたパラメータを宣言する必要さえないようです。 –

-2

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

スプレッドシートを凝視して値を変更したい場合は、セルを更新するタイミング付きトリガーを追加することを検討してください。トリガーの詳細を読むhere

+8

それはうまくいかないことを除いて、うまくいくでしょう。ページをリロードしても値はリフレッシュされません。さらに、セルを削除して同じ関数呼び出しを再入力すると、古い値が保持されます。同じ関数を別のセルから正確に呼び出すと、新しい値が表示されますが、古いセルには表示されません。 – tbkn23

25

これは少し古い質問です。しかし、このメソッドは、変更を加えること以外はユーザーの操作を必要としません。

tbkn23と似ていました。

再評価したい機能には、余分なパラメータ$ A $ 1があります。だから、関数呼び出しは

=myFunction(firstParam, $A$1) 

ですが、コード内の関数のシグネチャは、代わりに私がこの

function onEdit(e) 
{ 
    SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random()); 
} 
のようなのonEdit(e)の機能を使用しましたリフレッシュ機能を持っていることの

function myFunction(firstParam) 

です

この関数は、スプレッドシート内のセルが編集されるたびにトリガーされます。これで、セルを編集し、A1に乱数を入れ、tbkn23が提案したようにパラメータリストを更新し、カスタム関数の再評価を行いました。

+2

素晴らしいです。欠点は、元に戻す(Ctrl + Z)履歴が乱れていることです。 – Jon

+1

Jonが指摘しているように厄介な欠点を持つ素敵なトリック...私は誰かがそれを改善することを願っています:-) – Enissay

-1

これはスーパー古いスレッドかもしれませんが、私が今のようにこれをやろうとしている人にとっては便利かもしれません。

Lexiのスクリプトをそのまま使用すると、現在のシートではうまく動作していないようですが、ダミー変数をパラメータとして関数に追加すると(実際に関数内で使用する必要はありません)それは実際にページを再びリフレッシュするようにGoogleシートを強制するでしょう。

したがって、function myFunction(firstParam、dummy)のように宣言してから、それを呼び出すようにします。それは私のために働いた。それはあなたが編集し、あなたのシートのすべてに表示される確率変数のために迷惑である場合は、次のよう

はまた、1枚に制限する簡単な救済策がある:

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

これはほぼ同じですhttp://stackoverflow.com/a/27656313/1595451 –

+0

@Rubénとても似ていますしかし、良い迷惑で。アクティブなシートを使用する代わりに、定義されたシート名を使用して履歴を改善します。 –

7

これは非常に遅れていると私はそれが有用であろう知らないが、実際には、あなたはカスタム関数であれば、特定の列の中にあるが、単にそのCOLにより、スプレッドシートを注文自動的

enter image description here

+1

'NOW()'はカスタム関数ではなく、組み込み関数です。 –

+0

@Rubénあなたが更新したい任意のカスタム関数にNOW()関数を含めることができる点です – Thaina

+5

この時点で、カスタム関数の引数は決定論的でなければなりません。つまり、引数としてNOW()を使用しません。 https://developers.google.com/apps-script/guides/sheets/functions –

2

NOW()更新を行うここが可能に設定されていますumn。

この並べ替えは、その列のすべての行に対してカスタム関数を呼び出すデータの更新を強制します。

関連する問題