使用 Google Sheets 脚本检查每个键的缓存 sheet

Using Google Sheets script to check a cache sheet for each key

我正在从 Yahoo! 提取股市数据金融。对于不经常更改的数据,我不想联系 Yahoo!每次,但来自充当缓存的 db sheet 的源数据:

  1. yahoofinance() 从 'Dashboard' sheet
  2. 每个代码调用
  3. yahoofinance() 调用 db_data 以查看 ticker 的数据是否在 db
  4. 中可用

我有一个例子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
    }
  }
}

结果: