Ann*_*lee 4 google-sheets google-apps-script
我有一个包含大约30个importxml函数的大表,它们从一个通常每天更新两次的网站获取数据.
我想importxml及时(每8小时)为我的Google电子表格运行该功能,以便将数据保存在另一张表格中.保存已经有效,但更新不行!
我在Google Spreadsheet行更新中读到它可能每2小时运行一次,但我不相信这是真的,因为我将其添加到我的工作表中没有更改或更新,当电子表格未打开时.
我如何importxml以简单的方式"触发" 我的Google电子表格中的功能,因为我有很多importxml功能?
小智 10
要通过简单的“触发”来回答您的问题以强制重新加载函数:
向您正在加载的 url 添加一个额外的未使用参数,同时引用该参数值的单元格。更改该单元格的内容后,该函数将重新加载。
例子:
importxml("http://www.example.com/?noop=" & $A$1,"...")
Run Code Online (Sandbox Code Playgroud)
不幸的是,您不能将日期计算函数放入引用的单元格中,这会引发不允许这样做的错误。
Ger*_*bus 10
我对Mogsdad的回答做了一些调整:
releaseLock()通话放置...
function RefreshImports() {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return; // Wait up to 5s for previous refresh to end.
var id = "[YOUR SPREADSHEET ID]";
var ss = SpreadsheetApp.openById(id);
var sheet = ss.getSheetByName("[SHEET NAME]");
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
var content = "";
var now = new Date();
var time = now.getTime();
var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;
var re2 = /((\?|&)(update=[0-9]*))/gi;
var re3 = /(",)/gi;
for (var row=0; row<formulas.length; row++) {
for (var col=0; col<formulas[0].length; col++) {
content = formulas[row][col];
if (content != "") {
var match = content.search(re);
if (match !== -1 ) {
// import function is used in this cell
var updatedContent = content.toString().replace(re2,"$2update=" + time);
if (updatedContent == content) {
// No querystring exists yet in url
updatedContent = content.toString().replace(re3,"?update=" + time + "$1");
}
// Update url in formula with querystring param
sheet.getRange(row+1, col+1).setFormula(updatedContent);
}
}
}
}
// Done refresh; release the lock.
lock.releaseLock();
// Show last updated time on sheet somewhere
sheet.getRange(7,2).setValue("Rates were last updated at " + now.toLocaleTimeString())
}
Run Code Online (Sandbox Code Playgroud)
在谷歌电子表格行更新的问题,它的答案是指"旧表",其中有超过2015年的版本的谷歌表的做不同的行为."New Sheets"没有自动刷新内容; 现在仅在编辑时评估更改.
虽然床单不再本身提供了这种能力,我们就可以使用脚本来刷新"进口"的公式(IMPORTXML,IMPORTDATA,IMPORTHTML和IMPORTANGE).
要定期刷新IMPORT公式,请将此功能设置为时间驱动的触发器.
注意事项:
ScriptLock.这可能与脚本中该锁的其他用法冲突.
/**
* Go through all sheets in a spreadsheet, identify and remove all spreadsheet
* import functions, then replace them a while later. This causes a "refresh"
* of the "import" functions. For periodic refresh of these formulas, set this
* function up as a time-based trigger.
*
* Caution: Formula changes made to the spreadsheet by other scripts or users
* during the refresh period COULD BE OVERWRITTEN.
*
* From: https://stackoverflow.com/a/33875957/1677912
*/
function RefreshImports() {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return; // Wait up to 5s for previous refresh to end.
// At this point, we are holding the lock.
var id = "YOUR-SHEET-ID";
var ss = SpreadsheetApp.openById(id);
var sheets = ss.getSheets();
for (var sheetNum=0; sheetNum<sheets.length; sheetNum++) {
var sheet = sheets[sheetNum];
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
var tempFormulas = [];
for (var row=0; row<formulas.length; row++) {
for (col=0; col<formulas[0].length; col++) {
// Blank all formulas containing any "import" function
// See https://regex101.com/r/bE7fJ6/2
var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;
if (formulas[row][col].search(re) !== -1 ) {
tempFormulas.push({row:row+1,
col:col+1,
formula:formulas[row][col]});
sheet.getRange(row+1, col+1).setFormula("");
}
}
}
// After a pause, replace the import functions
Utilities.sleep(5000);
for (var i=0; i<tempFormulas.length; i++) {
var cell = tempFormulas[i];
sheet.getRange( cell.row, cell.col ).setFormula(cell.formula)
}
// Done refresh; release the lock.
lock.releaseLock();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17276 次 |
| 最近记录: |