【发布时间】:2020-02-03 15:57:44
【问题描述】:
我在构建一个脚本时遇到了困难,该脚本只会附加当前不存在于工作表上的行。
我有一个主表,我正在向其中导入csvData。目前,我有 1 个用于导入 csv 数据的脚本和另一个用于在导入后从可能的重复项中清除工作表的脚本。尽管这可行,但重复删除脚本使用.clearContent 并在返回唯一行列表之前强制完全清除工作表。由于电子表格是在外部使用的(通过 Appsheet),因此如果任何用户在执行脚本时尝试向工作表添加任何内容,则会产生未记录/损坏数据的风险。
因此,我正在尝试构建另一个脚本,它将csvData 导入一个空数组,然后将其与从主表中提取的数组进行比较。通过比较,该脚本只会附加主表上尚不存在的行。
不幸的是,我无法找到不清除工作表内容的重复删除示例。我有另一个想法来计算重复并只选择那些没有的,但我也无法制作一个工作脚本/找到一个例子。
以下是我的原始脚本,其中包括使用.clearContent 进行导入和重复删除:
function importEMS() {
var fSource=DriveApp.getFolderById('folder id removed');
var fi=fSource.getFilesByName('EMS.csv');
var ss=SpreadsheetApp.openById('sheet id removed');
//CONVERT CSV FILE TO A TABLE
if (fi.hasNext()) {
var file=fi.next();
var csv=file.getBlob().getDataAsString();
var csvData=CSVToArray(csv);
var timestamp = new Date();
var tsh=ss.getSheetByName('Main');
for (var i=1;i<csvData.length-1;i++) {
csvData[i][8] = timestamp;
}
//APPEND NEW ROWS
for (var i=1;i<csvData.length;i++) {
tsh.appendRow(csvData[i]);
}
}
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Main");
var data = sheet.getDataRange().getValues();
var newData = new Array();
for(i in data){
var row = data[i];
var duplicate = false;
for(j in newData){
if(row.slice(0,7).join().toLowerCase() == newData[j].slice(0,7).join().toLowerCase()){
duplicate = true;
}
}
if(!duplicate){
newData.push(row);
}
}
// Clear the existing info and update with newData.
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
有没有人知道如何将新行而不是整个 csvData 附加到主工作表?
提前感谢您的帮助!
UPD:向数据样本添加了link。真正的主表包含 20 列,但我从示例中删除了它们,列顺序相同。 CSV 导入表是我导入的数据类型。在该表上,我用绿色突出显示了我试图附加到主表的行。
UPD2:由 Oleg Valter 函数提供的解决方案,但前提是我将 .getValues() 替换为 .getDisplayValues(),它将所有现有类型的数据转换为字符串,这也是导入 .csv 数据的格式。
【问题讨论】:
-
你能分享一份你的数据文件和你的主表的样本副本吗?
-
有多个
EMS.csv文件吗?为什么除了第一行和最后一行之外的所有行都附加时间戳? -
您已经描述了这个问题,在我看来,您可能需要重新考虑这个问题。
CSVToArray返回一个二维数组,对吧?getValues()也是如此。如果您使用了filter()Array 方法,您可以只留下不等于getValues()返回的任何内容,然后追加结果。请问您是否需要toLowerCase()比较值? -
@OlegValter,我使用
.toLowerCase()来避免重复,因为有些销售是字母数字或纯文本。我了解您的解决方案的逻辑,但我无法真正在代码方面对其进行转换。您是否有一个如何使用filter()的示例? -
@OlegValter 谢谢!明天上班去看看,看看有没有效果!
标签: google-apps-script google-sheets