使用 Google Sheets 脚本检查每个键的缓存 sheet
Using Google Sheets script to check a cache sheet for each key
我正在从 Yahoo! 提取股市数据金融。对于不经常更改的数据,我不想联系 Yahoo!每次,但来自充当缓存的 db
sheet 的源数据:
yahoofinance()
从 'Dashboard' sheet 每个代码调用
yahoofinance()
调用 db_data
以查看 ticker
的数据是否在 db
中可用
我有一个例子sheet here.
function yahoofinance(ticker) {
if (db_data(ticker)) {
return get_db_data(ticker);
}
else {
return get_live_data(ticker);
}
}
function get_live_data(ticker) {
const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(ticker) + '?modules=price,assetProfile,summaryDetail';
let response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
if (response.getResponseCode() == 200) {
var object = JSON.parse(response.getContentText());
}
let fwdPE = object.quoteSummary.result[0]?.summaryDetail?.forwardPE?.fmt || '-';
let sector = object.quoteSummary.result[0]?.assetProfile?.sector || '-';
let mktCap = object.quoteSummary.result[0]?.price?.marketCap?.fmt || '-';
return [[fwdPE, sector, mktCap]];
}
function db_data(key) {
var db = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db');
var tickers = db.getDataRange('A2:A').getValues();
for (var r = 0; r <= tickers.length; r++) {
if (tickers[r] == key) {
return true // found a row with this key
}
else {
return false // no row with this key exists
}
}
}
问题:db_data()
找不到代码 AAPL
(参见 sheet Dashboard
),即使它存在于 sheet db
中所以 db_data()
中的匹配不起作用。我做错了什么?
具有评论中建议的更改的脚本的工作版本:
function yahoofinance(ticker) {
if (db_data(ticker)) {
return db_data(ticker);
}
else {
return get_live_data(ticker);
}
}
function get_live_data(ticker) {
const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(ticker) + '?modules=price,assetProfile,summaryDetail';
let response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
if (response.getResponseCode() == 200) {
var object = JSON.parse(response.getContentText());
}
let fwdPE = object.quoteSummary.result[0]?.summaryDetail?.forwardPE?.fmt || '-';
let sector = object.quoteSummary.result[0]?.assetProfile?.sector || '-';
let mktCap = object.quoteSummary.result[0]?.price?.marketCap?.fmt || '-';
return [[fwdPE, sector, mktCap]];
}
function db_data(key) {
var db = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db');
var tickers = db.getRange('A2:A').getValues();
for (var r = 0; r <= tickers.length; r++) {
if (tickers[r] == key) {
return true // found a row with this key
}
else {
return false // no row with this key exists
}
}
}
结果:
我正在从 Yahoo! 提取股市数据金融。对于不经常更改的数据,我不想联系 Yahoo!每次,但来自充当缓存的 db
sheet 的源数据:
yahoofinance()
从 'Dashboard' sheet 每个代码调用
yahoofinance()
调用db_data
以查看ticker
的数据是否在db
中可用
我有一个例子sheet here.
function yahoofinance(ticker) {
if (db_data(ticker)) {
return get_db_data(ticker);
}
else {
return get_live_data(ticker);
}
}
function get_live_data(ticker) {
const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(ticker) + '?modules=price,assetProfile,summaryDetail';
let response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
if (response.getResponseCode() == 200) {
var object = JSON.parse(response.getContentText());
}
let fwdPE = object.quoteSummary.result[0]?.summaryDetail?.forwardPE?.fmt || '-';
let sector = object.quoteSummary.result[0]?.assetProfile?.sector || '-';
let mktCap = object.quoteSummary.result[0]?.price?.marketCap?.fmt || '-';
return [[fwdPE, sector, mktCap]];
}
function db_data(key) {
var db = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db');
var tickers = db.getDataRange('A2:A').getValues();
for (var r = 0; r <= tickers.length; r++) {
if (tickers[r] == key) {
return true // found a row with this key
}
else {
return false // no row with this key exists
}
}
}
问题:db_data()
找不到代码 AAPL
(参见 sheet Dashboard
),即使它存在于 sheet db
中所以 db_data()
中的匹配不起作用。我做错了什么?
具有评论中建议的更改的脚本的工作版本:
function yahoofinance(ticker) {
if (db_data(ticker)) {
return db_data(ticker);
}
else {
return get_live_data(ticker);
}
}
function get_live_data(ticker) {
const url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + encodeURI(ticker) + '?modules=price,assetProfile,summaryDetail';
let response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
if (response.getResponseCode() == 200) {
var object = JSON.parse(response.getContentText());
}
let fwdPE = object.quoteSummary.result[0]?.summaryDetail?.forwardPE?.fmt || '-';
let sector = object.quoteSummary.result[0]?.assetProfile?.sector || '-';
let mktCap = object.quoteSummary.result[0]?.price?.marketCap?.fmt || '-';
return [[fwdPE, sector, mktCap]];
}
function db_data(key) {
var db = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('db');
var tickers = db.getRange('A2:A').getValues();
for (var r = 0; r <= tickers.length; r++) {
if (tickers[r] == key) {
return true // found a row with this key
}
else {
return false // no row with this key exists
}
}
}
结果: