【发布时间】: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