我在 A 列下列出了 URL,在 B 列下也列出了 URL。我想查找 A 列中列出但 B 列中未列出的 URL。
代码.gs
到目前为止我能够做到这一点。
function populateColumnC() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1");
var noOfRows = sheet.getLastRow()-1;
const dataRange = sheet.getRange(2,1,noOfRows,2);
sheet.getRange(1,3,1,1).setValue('Listed in A but not in B');
const dataValues = dataRange.getValues();
//Logger.log(dataValues);
for (var i =0; i<dataValues.length; i++) {
Logger.log(dataValues[i])
}
}
在你的展示脚本中,做如下修改怎么样?
在本例中,输出值是 URL。
function populateColumnC() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1");
var noOfRows = sheet.getLastRow() - 1;
const dataRange = sheet.getRange(2, 1, noOfRows, 2);
const dataValues = dataRange.getRichTextValues().map(r => r.map(c => c.getLinkUrl() || ""));
// Logger.log(dataValues);
const obj = new Set(dataValues.map(([, b]) => b));
const res = dataValues.reduce((ar, [a]) => {
if (!obj.has(a)) {
ar.push([a]);
}
return ar;
}, [['Listed in A but not in B']]);
sheet.getRange(1, 3, res.length).setValues(res);
}
当这个脚本运行时,我猜你的预期结果被放入“C”列中。
虽然我不确定你的实际电子表格,但如果
const dataValues = dataRange.getValues();
返回 URL,我认为 const dataValues = dataRange.getValues();
也可以用来代替 const dataValues = dataRange.getRichTextValues().map(r => r.map(c => c.getLinkUrl() || ""));
。
在这种情况下,输出值是包含超链接的富文本。
function populateColumnC() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1");
var noOfRows = sheet.getLastRow() - 1;
const dataRange = sheet.getRange(2, 1, noOfRows, 2);
const dataValues = dataRange.getRichTextValues();
const obj = new Set(dataValues.map(([, b]) => b.getLinkUrl()));
const res = dataValues.reduce((ar, [a]) => {
const url = a.getLinkUrl();
if (url && !obj.has(url)) {
ar.push([a]);
}
return ar;
}, [[SpreadsheetApp.newRichTextValue().setText('Listed in A but not in B').build()]]);
sheet.getRange(1, 3, res.length).setRichTextValues(res);
}