最近我从SO社区获得了大量帮助,我首先想对大家说声谢谢!
我最新的Google Sheet追求是查询sec.gov以获取给定报价的最新文件。我不是要抓取该网站,我只是想获取最新的文件,这样我可以提醒自己公司何时向SEC提交了新文件。
我目前正在通过importhtml和index对每个股票进行此操作:
index(
importhtml("https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK="&A2&"&owner=include&count=100",
"table",3),2)
...,股票代码在单元格A2中。但是,这一直无法正常工作,因为我一直在尝试使用2500多个股票行情。我注意到,一次有这么多调用时,importhtml会遇到问题。
是否有某种方法可以通过Google脚本自动执行此操作,这样我就可以每晚进行一次最新的归档(或最近5次左右的归档)?我对Google脚本和触发器非常熟悉,我只是不知道如何解决importhtml的限制,以及如何将脚本限制在最新的〜5个文件中,以免使电子表格不知所措。只需要在正确的方向上轻推即可。
谢谢!
我相信您的目标如下。
"4" "Document" "Statement..." "2020-04-17"
URL的值。=index(importhtml(URL,"table",3),2)
之类的公式放入单元格“ A1:A”,并且您要从第1行到第5行检索值。为了实现它们,这个答案怎么样?
此示例脚本的流程如下。
请复制以下脚本并将其粘贴到带有论坛的Google Spreadsheet的脚本编辑器中。并且请设置srcSheetName
和dstSheetName
的工作表名称。运行myFunction()
时,将检索值并将其放在目标表中。
function myFunction() {
const srcSheetName = "Sheet1"; // Please set the source sheet name.
const dstSheetName = "Sheet2"; // Please set the destination sheet name. The values are put to this sheet.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const srcSheet = ss.getSheetByName(srcSheetName);
const dstSheet = ss.getSheetByName(dstSheetName);
// 1. Replace the formula in the cells "A1:A5" of the source sheet.
const range = srcSheet.getRange("A1:A5");
range.createTextFinder("^\\=").matchFormulaText(true).useRegularExpression(true).replaceAllWith("=sample");
range.createTextFinder("^\\=sample").matchFormulaText(true).useRegularExpression(true).replaceAllWith("=");
SpreadsheetApp.flush(); // This might not be required.
// 2. Retrieve the values from the refreshed formulas.
const values = range.offset(0, 0, 5, srcSheet.getLastColumn()).getValues();
// 3. Put the values to the destination sheet.
dstSheet.getRange(dstSheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
}
myFunction()
功能。您可以在here处查看如何安装触发器。在此示例脚本中,从源工作表中检索了5个公式。然后将公式放到临时表中。从临时表中检索结果值。
function myFunction() {
const srcSheetName = "Sheet1"; // Please set the source sheet name.
const dstSheetName = "Sheet2"; // Please set the destination sheet name. The values are put to this sheet.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const srcSheet = ss.getSheetByName(srcSheetName);
const dstSheet = ss.getSheetByName(dstSheetName);
const tmpSheet = ss.insertSheet();
const srcRange = srcSheet.getRange("A1:A5");
const tmpRange = tmpSheet.getRange("A1:A5");
tmpRange.setFormulas(srcRange.getFormulas());
SpreadsheetApp.flush();
Utilities.sleep(5000); // This might not be required.
const values = tmpRange.offset(0, 0, 5, tmpSheet.getLastColumn()).getValues();
dstSheet.getRange(dstSheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
ss.deleteSheet(tmpSheet)
}