【问题标题】:How should I display ~1600 sparklines in Google Sheets?我应该如何在 Google 表格中显示 ~1600 个迷你图?
【发布时间】:2021-02-21 21:28:50
【问题描述】:

我应该如何在 Google 表格中显示 ~1600 个迷你图?我正在尝试构建一个电子表格来筛选约 400 只股票。我想使用类似于迷你图的东西来提供 5 年价格、6 个月价格、过去 5 年收入和 3 年预计收入的快速趋势。所以,这意味着我最多想显示约 1600 条迷你图。电子表格只需每周更新一次。目前,我正在测试一个函数(如下所示),为与股票代码对应的每个单元格生成迷你图。它适用于一列迷你图,但是,当我尝试制作两列或更多列迷你图(~800 条迷你图)时,脚本(也显示在下面)超过了最大执行时间。 The spreadsheet can be seen here.

迷你图的代码 sn-p:

// Global variables
var firstRow = 4;
var lastRow = 400;

var tickerColumn = "E";

function getPriceChartFromGoogle( pColumn, pDays) {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( pColumn + firstRow + ':' + pColumn + lastRow );
  cellRange.clear();
  cellRange.setFormula( '= SPARKLINE( GoogleFinance( ' + tickerColumn + firstRow + ', "price", TODAY()-' + pDays + ', TODAY() ) )' );
}

完整脚本:

// Global variables
var sheetName = "Stocks Screener";
var headerRow = 3;
var firstRow = 4;
var lastRow = 400;

var firstColumn = 'A';
var tickerColumn = "E";
var priceColumn = 'F';
var sixMonthsPriceChartColumn = 'G';
var fiveYearPriceChartColumn = 'H';
var bookValueColumn = 'I';
var priceToBookColumn = 'J';
var earningPerShareColumn = 'K';
var priceToEarningsRatioColumn = 'L';
var debtToEquityRatioColumn = 'M';
var operatingCashFlowColumn = 'N';
var leveredFreeCashFlowColumn = 'O';
var sectorColumn = 'P';
var lastColumn = 'Z';

updateData();

function updateData() {
  getSector();
  getPriceFromGoogle();
  getSixMonthPriceChartFromGoogle();
  getFiveYearPriceChartFromGoogle();
  getBookValuePerShareFromYahoo();
  getEarningPerShareFromGoogle();
  getPriceToEarningsRatioFromGoogle();
  getDebtToEquityRatioFromYahoo();
  getOperatingCashFlowFromYahoo();
  getLeveredFreeCashFlowFromYahoo();

  setHeaderFormat();
}

function setHeaderFormat() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( firstColumn + headerRow + ':' + lastColumn + headerRow );
  cellRange.setWrap(true);
}

function getPriceFromGoogle() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( priceColumn + headerRow );
  cellRange.clear();
  cellRange.setValue("CURRENT PRICE (from Google)");

  cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( priceColumn + firstRow + ':' + priceColumn + lastRow );
  cellRange.clear();
  cellRange.setFormula( '= GOOGLEFINANCE( ' + tickerColumn + firstRow + ' )' );
  cellRange.setValues( cellRange.getValues() );
}

function getPriceChartFromGoogle( pColumn, pDays) {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( pColumn + firstRow + ':' + pColumn + lastRow );
  cellRange.clear();
  cellRange.setFormula( '= SPARKLINE( GoogleFinance( ' + tickerColumn + firstRow + ', "price", TODAY()-' + pDays + ', TODAY() ) )' );
}

function getSixMonthPriceChartFromGoogle() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( sixMonthsPriceChartColumn + headerRow );
  cellRange.clear();
  cellRange.setValue("6 MO PRICE CHART (from Google)");

  getPriceChartFromGoogle( sixMonthsPriceChartColumn,183 );
}

function getFiveYearPriceChartFromGoogle() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( fiveYearPriceChartColumn + headerRow );
  cellRange.clear();
  cellRange.setValue("5 YR PRICE CHART (from Google)");

  getPriceChartFromGoogle( fiveYearPriceChartColumn,1780 );
}

function getBookValuePerShareFromYahoo() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( bookValueColumn + firstRow + ':' + bookValueColumn + lastRow );
  cellRange.clear();
  cellRange.setFormula( '= ( INDEX( IMPORTHTML( "https://finance.yahoo.com/quote/" & $' + tickerColumn + firstRow + '& "/key-statistics?p=" & $' + tickerColumn + firstRow + ',"table",8 ),6,2 ) )' );
  cellRange.setValues( cellRange.getValues() );
}

function getEarningPerShareFromGoogle() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( earningPerShareColumn + firstRow + ':' + earningPerShareColumn + lastRow );
  cellRange.clear();
  cellRange.setFormula( '= GOOGLEFINANCE( ' + tickerColumn + firstRow + ', "eps" )' );
  cellRange.setValues( cellRange.getValues() );
}

function getPriceToEarningsRatioFromGoogle() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( priceToEarningsRatioColumn + firstRow + ':' + priceToEarningsRatioColumn + lastRow );
  cellRange.clear();
  cellRange.setFormula( '= GOOGLEFINANCE( ' + tickerColumn + firstRow + ', "pe" )' );
  cellRange.setValues( cellRange.getValues() );
}

function getDebtToEquityRatioFromYahoo() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange(debtToEquityRatioColumn + firstRow + ':' + debtToEquityRatioColumn + lastRow);
  cellRange.clear();
  cellRange.setFormula( '= INDEX( IMPORTHTML( "https://finance.yahoo.com/quote/" & $' + tickerColumn + firstRow + ' & "/key-statistics?p=" & $' + tickerColumn + firstRow + ',"table",8 ),4,2 )' );
  cellRange.setValues( cellRange.getValues() );
}

function getOperatingCashFlowFromYahoo() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange(operatingCashFlowColumn + firstRow + ':' + operatingCashFlowColumn + lastRow);
  cellRange.clear();
  cellRange.setFormula( '= INDEX( IMPORTHTML( "https://finance.yahoo.com/quote/" & $' + tickerColumn + firstRow + '& "/key-statistics?p=" & $' + tickerColumn + firstRow + ',"table",9 ),1,2 )' );
  cellRange.setValues( cellRange.getValues() );
}

function getLeveredFreeCashFlowFromYahoo() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( leveredFreeCashFlowColumn + firstRow + ':' + leveredFreeCashFlowColumn + lastRow);
  cellRange.clear();
  cellRange.setFormula( '= INDEX( IMPORTHTML( "https://finance.yahoo.com/quote/" & $' + tickerColumn + firstRow + '& "/key-statistics?p=" & $' + tickerColumn + firstRow + ',"table",9 ),2,2 )' );
  cellRange.setValues( cellRange.getValues() );
}

function getSector() {
  var cellRange = SpreadsheetApp.getActiveSpreadsheet().getRange( sectorColumn + firstRow + ':' + sectorColumn + lastRow);
  cellRange.clear();
  cellRange.setFormula( '= index( importxml( "https://eresearch.fidelity.com/eresearch/goto/evaluate/snapshot.jhtml?symbols="&' + tickerColumn + firstRow + '&"","//div[@class=\'sub-heading\']//span[@class=\'right\']"),1)' );
  cellRange.setValues( cellRange.getValues() );
}

【问题讨论】:

    标签: google-apps-script optimization google-sheets google-sheets-formula


    【解决方案1】:

    每次从自定义菜单、具有自定义函数的公式等调用任何函数时,从全局范围 b/c 调用函数是一个坏主意。该函数将被执行。

    虽然它可能看起来对每种图表都有一个功能,但从电子表格性能的角度来看,对电子表格服务 b/c 进行如此多的调用并不是一个好主意,它们速度很慢,特别是那些像 @ 那样改变它的方法987654321@, setValues(), setFormula().

    要减少脚本的总执行时间,您必须更改其逻辑以减少对电子表格服务的调用,即

    • 不是一次清除一列,而是在一次调用中清除所有列
    • 不要一次添加一列公式,而是一次添加所有公式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      相关资源
      最近更新 更多