在数组上循环第一次迭代后,数组中的日期将丢失格式



我正在从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");

最新更新