= GOOGLEFINANCEを使用して、銘柄記号のある列Aを読み取り、右側の列に価格を入力するGoogleスプレッドシートアプリを作成しています
これは毎日更新され、AとBの間の列にB1の日付コードで追加されます。
更新されるたびに、新しいデータが追加されるのではなく、データがコピーされます。値自体を入力するのではなく、数式自体をスプレッドシートに追加しているようです。
ここに私のコードがあります
function myFunction() {
SpreadsheetApp.getActiveSheet().insertColumns(2);
SpreadsheetApp.getActiveSheet().getRange('B1').setValue('=now()');
SpreadsheetApp.getActiveSheet().getRange('B2:B10').setValue('=iferror(GOOGLEFINANCE(A2:A10,"price"),"")');
}
更新されるたびに、新しいデータが追加されるのではなく、データがコピーされます。値自体を入力するのではなく、数式自体をスプレッドシートに追加しているようです。
私が正しく理解していれば、値を更新し続けるのではなく、列が追加されたときの価格の「スナップショット」を列に保持してほしいと思います。
これを行うには、式をその時点で計算された値に置き換えて値を「フリーズ」します。
// select the range you want to "freeze":
var range = SpreadsheetApp.getActiveSheet().getRange('B:B');
// replace the cell formulas with the calculated values:
range.setValues(range.getValues());
GOOGLEFINANCE
関数を使用してこれを手動でテストし、関数を数値として現在の価格に置き換えました。これを関数の最後に追加して、取得後に価格を「凍結」することができます。
別の解決策は、GOOGLEFINANCE
関数で start_date
パラメーター を使用することです。現在の日付を値として取得し、それをstart_date
として式に渡すと、その日付の価格が常に取得されます。