我正在用这张谷歌单子制作一份经过过滤的贸易提案清单。我想删除那些已经放在网上在过去5-10分钟,只显示较老的。我想避免在私人安排中做广告。
该工作表现在每5分钟从带有IMPORTHTML的网站中提取一张表。我使用一个app脚本来增加一个值,该值稍微改变IMPORTHTML函数,使其强制进行更新。在另一张纸上有一个过滤器函数,我会删除所有那些不感兴趣的交易。
我如何能够检查由IMPORTHTML导入的单元格的内容在更新期间是否保持不变?
我不知道我有什么选择。我被限制在什么是免费使用,不需要我的电脑连接。
发布于 2022-09-04 06:28:34
一种方法是在新的“交易存档”表中创建一个增量交易存档,如下所示:
/**
* Run this function through an installable trigger every 10 minutes.
*
* @param {Object} e The event object (unused.)
*/
function timeTrigger(e) {
refreshImportHtml_();
archiveData_();
}
/**
* Increments a counter to force importhtml() to update.
*/
function refreshImportHtml_() {
const cell = SpreadsheetApp.getActive().getRange('trades!M3');
cell.setValue((Number(cell.getValue()) || 0) + 1);
SpreadsheetApp.flush();
}
/**
* Appends rows from 'trades!A2:F' to 'trades archive' provided that
* an identical row does not already appear there.
* Each row is prefixed with a timestamp.
*/
function archiveData_() {
// version 1.0, written by --Hyde, 4 September 2022
// - see https://webapps.stackexchange.com/a/166441/269219
const timestamp = new Date();
const ss = SpreadsheetApp.getActive();
const source = { range: ss.getRange('trades!A2:F') };
const target = { sheetName: 'trades archive' };
target.sheet = ss.getSheetByName(target.sheetName);
if (!target.sheet) {
target.sheet = ss.insertSheet(target.sheetName).appendRow(['Timestamp', 'Data']);
target.sheet.setFrozenRows(1);
}
target.range = target.sheet.getRange(source.range.getA1Notation()).offset(0, 1);
target.keys = target.range.getValues().map(row => row.join(''));
source.range.getValues().forEach(row => {
const sourceKey = row.join('');
if (sourceKey && !target.keys.includes(sourceKey)) {
target.sheet.appendRow([timestamp].concat(row));
}
});
}
新的表将包含一个不断增加的时间标记的名单,所有的交易已经公布。
然后插入>工作表,将新工作表命名为“交易新”,并将此公式放入单元格
=filter(
trades!A2:J,
len(trades!A2:A),
match(
transpose(query(transpose(trades!A2:F), "", 9^9)),
transpose(query(transpose('trades archive'!B2:G), "", 9^9)),
0
)
)
中:
A2
公式将在“交易”中显示行,但前提是它们也出现在“交易存档”中。换句话说,它忽略了比已经归档的行更近的行。
最后,修改'Filtered list'!A2
中的公式如下:
=filter('trades new'!A2:F, 'trades new'!I2:I = 0)
请注意,此解决方案将每十分钟“重置”一次,每次从零开始缓冲时间。按照您的要求,要获得至少5分钟的缓冲时间,请使用以下公式:
=filter(
'trades archive'!B2:G,
isnumber('trades archive'!A2:A),
'trades archive'!A2:A <= now() - 5 / 60 / 24,
match(
transpose(query(transpose('trades archive'!B2:G), "", 9^9)),
transpose(query(transpose(trades!A2:F), "", 9^9)),
0
)
)
这个公式的作用正好相反,它将在“交易存档”中显示行,但前提是它们也出现在“交易”中,而且只有在它们存在超过5分钟的情况下才能显示。缺点是,需要输入数组公式才能获得要显示的其他计算列。
https://webapps.stackexchange.com/questions/166297
复制相似问题