Here is one approach. The script should be attached to the master spreadsheet (Tools > Script editor) and set to run on daily basis (Edit > Current project's triggers). To run, it needs the destination folder Id (the part of folder URL after /folders/
).
The new copy is named like "original file name 2017-07-25 19:11:23" which also serves the purpose of timestamping. This is actually UTC time... there are other options, such as
var timestamp = new Date().toLocaleString();
(returns July 25, 2017 3:17:45 PM EDT)
or
var timestamp = new Date().toDateString();
(returns Tue Jul 25 2017).
Both of the above depend on local date conventions of the owner of master sheet.
function duplicateSpreadsheet() {
var folder = DriveApp.getFolderById("folder Id here");
var timestamp = new Date().toISOString().replace("T", " ").split(".")[0];
var ss = SpreadsheetApp.getActiveSpreadsheet();
var file = DriveApp.getFileById(ss.getId());
file.makeCopy(folder).setName(file.getName() + " " + timestamp);
}
Further reading
DriveApp and SpreadsheetApp
Functions like GOOGLEFINANCE are only updated when the spreadsheet is open by a user, there isn't a Google Apps Script method that is able to do this. The closest is SpreadsheetApp.flush() but this only makes that the changes made by the script be pushed to the spreadsheet.
One alternative is to rethink your model and take advantage that ...
GOOGLEFINANCE already offer a way to report historic data. The syntax is
GOOGLEFINANCE(ticker, [attribute], [start_date], [end_date|num_days], [interval])
Example
The following formula returns the daily close values of NASDAQ:GOOG
from January 1, 2017 to today.
A1:
=GOOGLEFINANCE("NASDAQ:GOOG","price","1/1/2017",TODAY())
The following formula returns the daily close values of NASDAQ:AMZN
from January 1, 2017 to today.
D1:
=GOOGLEFINANCE("NASDAQ:AMZN","price","1/1/2017",TODAY())
To calculate the daily average, we could not use AVERAGE with ARRAYFORMULA but we could use the +
and /
operands:
G1:
=ArrayFormula((B2:B+E2:E)/2)
Note:
Suggestion: Delete the blank rows at the bottom in order to make the calculation of the daily average just for the rows with data.
The history daily average will be calculate from the start date to the actual date every time that the spreadsheet be recalculated.
Result (extract):
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
Note:
Google spreadsheet functions are only recalculated while the spreadsheet is open, so using a script to be ran while the spreadsheet is not opened by anyone will retrieve the values saved the last time the spreadsheet was online-opened/synced offline changes.
References
Best Answer
Yes, it's possible. Instead of setValues(sourcevalues) you could use setFormulas(formulas)