web-dev-qa-db-ja.com

更新されたGOOGLEFINANCE値をスクリプトで自動的に保存する

  • こんにちは、多くの株価の組み合わせの利益を追跡したいです。そのために、Googleスプレッドシートには、購入した価格、ブローカーのコスト、および現在計算されている価格を考慮して、利益または損失の比率を計算する多くの数式があります。

    =GOOGLEFINANCE("MARKET:COMPANY";"price")
    
  • この質問を簡単にするために、次の値があるとします。セルA1に:

    =GOOGLEFINANCE("NASDAQ:GOOG";"price")
    

    セルA2内:

    =GOOGLEFINANCE("NASDAQ:AMZN";"price")
    

そして、これら2つの値の平均を追跡したいので、A3:

=AVERAGE(A1:A2)

次に、新しいシートを作成し、日付と値の2つの列のヘッダーを配置します。このシートでは、毎日00:00にセルA3の値と日付を保存して、毎日の値のグラフを作成します。

これを行うには、関数を作成します。

function recordHistory() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();

 var sheet1 = ss.getSheetByName("Stocks"); //Get values
 var source = sheet1.getRange("A2:A3");
 var values = source.getValues();

 var result = new Array(2); //Sort by date
 result[0] = new Date();
 result[1] =  values[1][0];

 var sheet2 = ss.getSheetByName("History"); //Store
 sheet2.appendRow(result);
};

最後にトリガーを作成します。別の言語のスプレッドシートがあるため、翻訳が正しいかどうかはわかりませんが、次のようなものです。

function, time based, daily, at midnight 

まあ、これはうまくいくようです。毎日その値は真夜中に更新されます。最後の日は毎日スプレッドシートを使用していたので、問題があるかどうかはわかりませんでした。しかし、1週間もまったく見なかった後、値が常に同じであることがわかりました。つまり、前回ブラウザでシートを開いたときにGOOGLEFINANCEから計算された値です。

そのため、動作しますが、GOOGLEFINANCEの更新された値は使用しません。

値を保存する前に、スクリプトからすべてのGOOGLEFINANCE依存値を更新することは可能ですか?

Update:問題をより簡単にしようとして、間違った質問をしたと思います。だから、私はそれを再定式化しようとします。多くの国際市場と通貨のすべての操作を保存する必要があるシートの簡略版を作成しました: Example

全体の純利益は次のとおりです。

=(sum(SOLD)-sum(BOUGHT))/sum(BOUGHT)

購入したセルは手動で入力します。

=Shares * Price * Currency Exchange when bought

販売済みセルには、Googlefinanceデータが自動的に入力されます。

=Shares * Current price * Current  Currency exchange conversion - Broker costs

さて、この更新(セル番号を変更する)の上に書いたスクリプトで、セルM6を追跡したいのですが、すべての株の組み合わせで時間の経過を確認してください。

何かを販売したら、手動でセルを変更します。セルは、これまではGoogle Financeで固定値に自己更新していました。

問題と質問:スクリプトはこれを適切に行いますが、ブラウザでスプレッドシートを開いている場合のみです。毎日真夜中に実行されるスクリプトから、すべてのGooglefinance値(現在の価格と$ /€(現在))に「更新」などを呼び出す方法があるかどうかを知りたいのですが。

3
nck

Yahooおよびgoogle Finance APIをgoogle appsスクリプトから使用することは推奨されないため、これを回避する唯一の方法は、スクリプトからgooglefinanceクエリを文字列として生成し、シートに書き込むことだと思います。次に、シートに入力すると、それらのクエリが送信されます。

私はこれがこれを行う最もエレガントな方法だとは思いませんし、それらのデータを扱うのもかなり遅いですが、別の解決策を見つけることができませんでした。

誰かが同じことをしたい場合 here は、例として履歴データを生成するためにしたことです。変更が必要なエラーがあるかもしれませんが、参考としては十分だと思います。私のプロジェクトでは、期待どおりに機能しました。

1
nck

GOOGLEFINANCEなどの機能は、ユーザーがスプレッドシートを開いたときにのみ更新されます。これを実行できるGoogle Apps Scriptメソッドはありません。最も近いのは SpreadsheetApp.flush() ですが、これにより、スクリプトによって行われた変更がスプレッドシートにプッシュされるだけです。

1つの選択肢は、モデルを再考し、それを活用することです...

GOOGLEFINANCE は、過去のデータを報告する方法をすでに提供しています。構文は

GOOGLEFINANCE(ticker, [attribute], [start_date], [end_date|num_days], [interval])

次の式は、2017年1月1日から今日までのNASDAQ:GOOGの毎日の終値を返します。

A1:

=GOOGLEFINANCE("NASDAQ:GOOG","price","1/1/2017",TODAY())

次の式は、2017年1月1日から今日までのNASDAQ:AMZNの毎日の終値を返します。

D1:

=GOOGLEFINANCE("NASDAQ:AMZN","price","1/1/2017",TODAY())

1日の平均を計算するために、ARRAYFORMULAでAVERAGEを使用できませんでしたが、+および/オペランドを使用できました。

G1:

=ArrayFormula((B2:B+E2:E)/2)

注意:
提案:データのある行のみの1日の平均を計算するために、下部の空白行を削除します。

履歴の1日の平均は、スプレッドシートが再計算されるたびに、開始日から実際の日付まで計算されます。

結果(抽出):

Date               Close        Date               Close        Average
 1/3/2017 16:00:00  786.14       1/3/2017 16:00:00  786.14      786.14
 1/4/2017 16:00:00   786.9       1/4/2017 16:00:00   786.9       786.9
 1/5/2017 16:00:00  794.02       1/5/2017 16:00:00  794.02      794.02
 1/6/2017 16:00:00  806.15       1/6/2017 16:00:00  806.15      806.15
 1/9/2017 16:00:00  806.65       1/9/2017 16:00:00  806.65      806.65
1/10/2017 16:00:00  804.79      1/10/2017 16:00:00  804.79      804.79

注意:
Googleスプレッドシート関数は、スプレッドシートが開いている間のみ再計算されるため、スプレッドシートが誰も開かないときに実行するスクリプトを使用すると、スプレッドシートが最後にオンラインで開かれた/オフラインで同期されたときに保存された値が取得されます。

参照資料

5
Rubén