我正在从URL中提取CSV数据。我已经将其解析为一个名为"data"的变量。它看起来像这样:
[
[ID, Sometext (dd-MM-YYYY), Othertext (dd-MM-YYYY), Whatevertext (dd-MM-YYYY)],
[1, yes, no, no],
[2, yes, yes, no],
[3, no, yes, no],
etc...
]
如果某个文本出现在第一个数组(csv标头(中,则应为其分配另一个文本。日期没有按时间顺序排列,但应该是。
我做了一个循环来遍历标题,提取日期,将其更改为日期类型,并根据需要替换文本。将两个值放入一个数组中,并使用排序函数按日期对数组进行排序。
[
[Thu Aug 27 00:00:00 GMT+02:00 2020, Text1], [Fri Aug 28 09:00:00 GMT+02:00 2020, Text2], [Sat Aug 29 09:00:00 GMT+02:00 2020, Text3]
etc.
]
接下来,我将在以下行上循环,如果值等于yes,我将向该ID的数组中添加新的标头值。在迭代结束时,我希望将Date类型转换回dd MMYYYY格式。
在第一次迭代中,这很好。但在第二次迭代中,它给出了一个错误,因为日期不再是日期类型。
现在我知道这对于多个嵌套循环来说非常难看,但据我所知,data[0]中的值的更改是在下一组循环开始之前完成的。新值出现在第一次迭代中,但不出现在第二次迭代中。我不明白为什么?
var response = UrlFetchApp.fetch(url);
var data = Utilities.parseCsv(response, ";")
for (var i = 7; i < data[0].length; i++) {
var type;
if (/text1/.test(data[0][i]) === true) {
type = "Text 1";
} else if
(/text2/.test(data[0][i]) === true) {
type = "Text 2";
} else if
(/text3/.test(data[0][i]) === true) {
type = "Text 3";
} else if
(/text4/.test(data[0][i]) === true) {
type = "Text 4";
} else if
(/text5/.test(data[0][i]) === true) {
type = "Text5";
};
data[0][i] = data[0][i].match(/(([^)]+))/)[1]
var dateParts = data[0][i].split("-");
data[0][i] = [new Date(+ dateParts[2], dateParts[1] - 1, + dateParts[0], 9, 0 ,0)];
data[0][i].push(type)
};
var idsArray = [];
for (var j = 1; j < data.length; j++) {
var id = [];
for (var k = 7; k < data[j].length; k++) {
if (data[j][k] === "yes") {
id.push(data[0][k])
};
};
id.sort(sortFunction);
for (var m = 0; m < id.length; m++) {
id[m][0] = Utilities.formatDate(id[m][0], "Europe/Amsterdam", "dd-MM-yyyy");
}
id.unshift(data[j][3]);
idsArray.push(id);
}
在语句中使用Utilities.formatDate()
时
id[m][0] = Utilities.formatDate(id[m][0], "Europe/Amsterdam", "dd-MM-yyyy");
您正在将存储在id[m][0]
中的数据的数据类型从Date
更改为string
。
id[m][0]
中存储的数据是什么?你把data[0][k]
放在那里:
id.push(data[0][k])
现在的问题是,它是否从data
复制了Date
,并为id
阵列提供了一个新的Date
?不,JavaScript不复制对象;您只需要引用存储在data
数组中的原始Date
对象。
因此,您通过更新您认为独立的其他数组(id
(,间接地更改了data
中的值。
更新您的赋值语句,这样您就不会覆盖现有的对象。
var dateString = Utilities.formatDate(id[m][0], "Europe/Amsterdam", "dd-MM-yyyy");