CSV转换脚本到谷歌工作表格式行为不正确



我,目前使用这个自动脚本自动转换动态csv表为谷歌格式,为进一步修改。

function importCSVFromGoogleDrive() {
var file = DriveApp.getFilesByName('Inventory.csv').next();
var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}

虽然脚本在大多数情况下都可以工作,但是,偶尔它不会替换初始数据,而是添加行的副本,从而导致重复。

数据应该是这样的:

House Number   Color   Family  Complaints 
22             Red     Smiths  4
A65            Blue    Stefans 5 
18             Yellow  Dolmens 2

在理想情况下,每次脚本被激活时,它都会从动态csv中提取数据并替换现有数据。

然而,偶尔经过一天的脚本工作每分钟或5分钟。我发现它是这样的状态:

House Number    Color   Family  Complaints 
22           Red     Smiths  4
A65          Blue    Stefans 5 
18           Yellow  Dolmens 2 
22           Red     Smiths  4 
A65          Blue    Stefans 5 
18           Yellow  Dolmens 2 
22           Red     Smiths  5 
A65          Blue    Stefans 5 
18           Yellow  Dolmens 3

可以看到,它不是修改现有的行,而是偶尔为数据创建一组新的行。现在这种情况很少发生,因为在每5分钟运行脚本一天之后,我可能只有4-5个额外的行集。

您将注意到,在示例中,在最后一组行中数据发生了变化,这只是为了表明由于动态csv的性质,数据将发生变化。但是,它应该覆盖原来的行,而不是创建新的行集。

这个问题的正确解决方案是什么?

不知道为什么它失败了,但也许这是解决方案。所以我们自己解析csv。

splitCsv()函数是在这里的另一个帖子。我似乎找不到它了。

function importCSVFromGoogleDrive() {
const file = DriveApp.getFilesByName('Inventory.csv').next();
const csv = file.getBlob().getDataAsString()
const csvData = csv.split("n").map(row => splitCsv(row));
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}
/**
* Splits the csv line to columns and escaping the comma's inside double qoutes.
* @param {string} str the csv line string.
* @returns {array} array of columns
*/
function splitCsv(str) {
return str.split(",").reduce(
(acc, cur) => {
if (acc.isConcatting) {
acc.soFar[acc.soFar.length - 1] += "," + cur;
} else {
acc.soFar.push(cur);
}
if (cur.split('"').length % 2 == 0) {
acc.isConcatting = !acc.isConcatting;
}
return acc;
},
{ soFar: [], isConcatting: false }
).soFar;
}

最新更新