こんにちは、多くの株価の組み合わせの利益を追跡したいです。そのために、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:問題をより簡単にしようとして、間違った質問をしたと思います。だから、私はそれを再定式化しようとします。多くの国際市場と通貨のすべての操作を保存する必要があるシートの簡略版を作成しました:
全体の純利益は次のとおりです。
=(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値(現在の価格と$ /€(現在))に「更新」などを呼び出す方法があるかどうかを知りたいのですが。
Yahooおよびgoogle Finance APIをgoogle appsスクリプトから使用することは推奨されないため、これを回避する唯一の方法は、スクリプトからgooglefinanceクエリを文字列として生成し、シートに書き込むことだと思います。次に、シートに入力すると、それらのクエリが送信されます。
私はこれがこれを行う最もエレガントな方法だとは思いませんし、それらのデータを扱うのもかなり遅いですが、別の解決策を見つけることができませんでした。
誰かが同じことをしたい場合 here は、例として履歴データを生成するためにしたことです。変更が必要なエラーがあるかもしれませんが、参考としては十分だと思います。私のプロジェクトでは、期待どおりに機能しました。
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スプレッドシート関数は、スプレッドシートが開いている間のみ再計算されるため、スプレッドシートが誰も開かないときに実行するスクリプトを使用すると、スプレッドシートが最後にオンラインで開かれた/オフラインで同期されたときに保存された値が取得されます。
参照資料