Javascript 以不同速率在阵列中循环
Javascript 以不同速率在阵列中循环,javascript,arrays,for-loop,google-apps-script,Javascript,Arrays,For Loop,Google Apps Script,filenamed是我想要用来积累和设置数据的引用数组。因此,对于名为的文件中的每个索引,来自包含相同电影标题的emailData的数组应该累加起来,并最终设置在google电子表格的范围内。把数据放在一个范围之外,我在这个任务的第一部分遇到了问题 var filesNamed = [ ["Happiness","Karate for Life","Dogtooth","The Streetfighter","Mind Game","The Raid","Th
filenamed
是我想要用来积累和设置数据的引用数组。因此,对于名为的文件中的每个索引,来自包含相同电影标题的emailData
的数组应该累加起来,并最终设置在google电子表格的范围内。把数据放在一个范围之外,我在这个任务的第一部分遇到了问题
var filesNamed = [
["Happiness","Karate for Life","Dogtooth","The Streetfighter","Mind Game","The Raid","The Hole","Plaga Zombie","Funny Games"]
];
var emailData = [
["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
["Date","Happiness","Sender 1","Receiver 1","Subject 1" ],
["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
["Date","Karate for Life","Sender 2","Receiver 2","Subject 2" ],
["Date","Dogtooth","Sender 3","Receiver 3","Subject 3" ],
["Date","Dogtooth","Sender 3","Receiver 3","Subject 3" ],
["Date","Dogtooth","Sender 3","Receiver 3","Subject 3" ],
["Date","Dogtooth","Sender 3","Receiver 3","Subject 3" ],
["Date","The Streetfighter","Sender 4","Receiver 4","Subject 4" ],
["Date","The Streetfighter","Sender 4","Receiver 4","Subject 4" ],
["Date","The Streetfighter","Sender 4","Receiver 4","Subject 4" ],
["Date","The Streetfighter","Sender 4","Receiver 4","Subject 4" ],
["Date","Mind Game","Sender 5","Receiver 5","Subject 5" ],
["Date","Mind Game","Sender 5","Receiver 5","Subject 5" ],
["Date","Mind Game","Sender 5","Receiver 5","Subject 5" ],
["Date","Mind Game","Sender 5","Receiver 5","Subject 5" ],
["Date","The Raid","Sender 15","Receiver 15","Subject 15" ],
["Date","The Raid","Sender 15","Receiver 15","Subject 15" ],
["Date","The Raid","Sender 15","Receiver 15","Subject 15" ],
["Date","The Raid","Sender 15","Receiver 15","Subject 15" ],
["Date","The Hole","Sender 25","Receiver 25","Subject 25" ],
["Date","The Hole","Sender 25","Receiver 25","Subject 25" ],
["Date","The Hole","Sender 25","Receiver 25","Subject 25" ],
["Date","Plaga Zombie","Sender 35","Receiver 35","Subject 35" ],
["Date","Plaga Zombie","Sender 35","Receiver 35","Subject 35" ],
["Date","Plaga Zombie","Sender 35","Receiver 35","Subject 35" ],
["Date","Funny Games","Sender 45","Receiver 45","Subject 45" ],
["Date","Funny Games","Sender 45","Receiver 45","Subject 45" ]
];
下面代码的问题是,虽然第一次循环通过名为[0][0]==emailData[0][1]
的文件返回一个匹配项,但第二次循环通过时,两个for循环都是递增的-但是我们还没有完成从上面标题为“快乐”的所有数组的累积(还有4个)。我认为计数器应该只在循环中断后增加,这意味着我们已经到达属于移动的最后一个数组。我尝试将计数器(l++)放在else语句中,但这不起作用
尽可能简单地说:我希望数组中属于特定电影标题的所有数据都放在自己的电子表格中。每个子数组(从日期开始)都应该放在自己的行上,其中索引将跨越5列
function theo (){
Logger.log("emailData.length: " + emailData.length);
Logger.log("filesNamed[0].length: " + filesNamed[0].length);
for(var i=0;i<emailData.length;i++){
for(var l=0;l<filesNamed[0].length;l++){
if(filesNamed[0][l] == emailData[i][1]){
Logger.log("");
Logger.log("match");
Logger.log("emailData[0]): " + emailData[i][1]);
Logger.log("filesNamed[0][l]: " + filesNamed[0][l]);
Logger.log("");
Logger.log("l: "+l);
Logger.log("i: "+i);
} else {
Logger.log("");
Logger.log("broke");
Logger.log("emailData[0]): " + emailData[i][1]);
Logger.log("filesNamed[0][l]: " + filesNamed[0][l]);
Logger.log("");
Logger.log("l: "+l);
Logger.log("i: "+i);
}
}
}
}
函数theo(){
Logger.log(“emailData.length:+emailData.length”);
Logger.log(“filenamed[0].length:+filenamed[0].length”);
对于(var i=0;i您想知道是否与电影标题匹配。您可以使用indexOf()
确定数组是否具有特定元素
如果在“filenamed”数组中的任意位置找到“Happiness”一词,则会为变量“isItA_Match”分配一个索引号。如果没有匹配项,则返回值-1
此代码不完整或不正确,但希望您了解我尝试使用的逻辑:
function theo() {
Logger.log("emailData.length: " + emailData.length);
Logger.log("filesNamed[0].length: " + filesNamed[0].length);
var happinessArray = [];
var karateArray = [];
//Create all the arrays for each movie Title
for(var i=0;i<emailData.length;i++) {
var elmtToMatch = emailData[i][1];
var isItA_Match = filesNamed.indexOf(elmtToMatch);
if (isItA_Match > -1) {
Logger.log("match");
//put data into correct Array
if (matchCorrectArray) {
happinessArray = data;
}
};
};
};
创建一个将电影名称与数组名称匹配的对象
调用函数以循环打开每个电子表格的过程
function addDataToSheets() {
//An object that matches the movie title to the spreadsheet ID
var objMovieToSheetID = {"Happiness":"48rjdjfoierawj", "Karate for Life":"894ilkdjfhwo"};
var objMovieToArrayName = {"Happiness":"Hap", "Karate for Life":"Kar"};
//Loop through all the movie titles and add data to each spreadsheet
for(var i=0; i<objSheetToArrayName.length; i++){
// The code below opens a spreadsheet using its ID and logs the name for it.
// Note that the spreadsheet is NOT physically opened on the client side.
// It is opened on the server only (for modification by the script).
//get each movie name from the array in sequence by index
var movieName = filesNamed[i];
//Retrieve the spreadsheet ID from the object that matches movie name to spreadsheet ID
var ssID = objSheetToArrayName[movieName];
var ss = SpreadsheetApp.openById(ssID);
Logger.log(ss.getName());
var dataToAppend = emailData[objMovieToArrayName[movieName]];
// Appends a new row with to the bottom of the
// spreadsheet containing the values in the array
sheet.appendRow(dataToAppend);
};
};
函数addDataToSheets(){
//将电影标题与电子表格ID匹配的对象
var ObjMovietSheetId={“幸福”:“48RjdFoierawj”,“终身空手道”:“894ilkdjfhwo”};
var objMovieToArrayName={“幸福”:“Hap”,“终身空手道”:“Kar”};
//循环浏览所有电影标题,并向每个电子表格添加数据
对于(var i=0;i,我认为您正在寻找的最简单的累加可以是这样的
function theo2() {
var accumulatedFiles = filesNamed[0].map(
function (title) {
var emails = this;
return {
title: title,
emails: emails.filter(
function (email) {
var title = this;
return email[1] == title;
},
title
)
};
},
emailData
);
}
这将生成一个对象数组,其中第一个索引与filenamed
中的电影标题索引一致,标题属性标题和电子邮件属性该索引中的数组与标题匹配
副产品是,它只返回标题与原始源列表匹配的电子邮件。如果您想让电子邮件响应确定标题累积,而不使用filenamed
数组,则可以更紧凑
这将是一个开始,您可以使用它来填充图纸或执行任何您想执行的操作
正如Sandy指出的那样,上面的函数放弃使用循环,而是使用.map()
和.filter()
。循环也可以工作,但我个人更喜欢方法的语义描述和简洁性
为了完整性,循环形式可能是这样的(猜猜看,它或多或少是您已经拥有的):
函数theo3(){
var累计文件=[],
电影电子邮件=[];
对于(var i=0;i
除了将日志记录作为一种调试方法外,您希望从这些循环中得到什么?您说的是累积的电子邮件数组,但不清楚您想要的是什么,或者您拥有的是什么不起作用。我在两个代码段之间解释了为什么这不起作用。目的是将属于特定电影标题的所有数组设置为一行具有相同电影标题的特定google电子表格。此列表将继续累积新电影标题,并且每个电影标题将继续累积数组。恐怕我没有遇到问题。运行theo
在filenamed
中循环,每次递增emailData
,但指向文件的链接是什么具体陷阱?您希望emailData中的所有数组都是单独的行或每个标题连接起来?从您的问题编辑中,我认为您已经得到了您想要的,但不是您期望的。交换循环,您将看到相同的匹配,但顺序不同。这也是我的想法,但这是累积的细节我不清楚mrcni想要什么。每个电影标题都有单独的文件,单独的表格等?好吧,最坏的情况是我有可能投反对票有时,我希望得到最好的答案。我希望属于特定电影标题的所有数据都放在自己的电子表格中。每个子数组应该放在自己的行上,其中索引将跨越5列。我会创建一个对象,将每个电影名称与要存储数据的工作表的电子表格ID相匹配。我更新了我的答:我还没有为所有的数组编写出代码,但希望你能看到我在使用它。方法的一些链接:和:它们不受所有浏览器的支持,但完全受Google Apps脚本的支持——尽管如果在其中添加断点,IDE调试器会中断。
var objMovieToArrayName = {"Happiness":"Hap", "Karate for Life":"Kar"};
function addDataToSheets() {
//An object that matches the movie title to the spreadsheet ID
var objMovieToSheetID = {"Happiness":"48rjdjfoierawj", "Karate for Life":"894ilkdjfhwo"};
var objMovieToArrayName = {"Happiness":"Hap", "Karate for Life":"Kar"};
//Loop through all the movie titles and add data to each spreadsheet
for(var i=0; i<objSheetToArrayName.length; i++){
// The code below opens a spreadsheet using its ID and logs the name for it.
// Note that the spreadsheet is NOT physically opened on the client side.
// It is opened on the server only (for modification by the script).
//get each movie name from the array in sequence by index
var movieName = filesNamed[i];
//Retrieve the spreadsheet ID from the object that matches movie name to spreadsheet ID
var ssID = objSheetToArrayName[movieName];
var ss = SpreadsheetApp.openById(ssID);
Logger.log(ss.getName());
var dataToAppend = emailData[objMovieToArrayName[movieName]];
// Appends a new row with to the bottom of the
// spreadsheet containing the values in the array
sheet.appendRow(dataToAppend);
};
};
function theo2() {
var accumulatedFiles = filesNamed[0].map(
function (title) {
var emails = this;
return {
title: title,
emails: emails.filter(
function (email) {
var title = this;
return email[1] == title;
},
title
)
};
},
emailData
);
}
function theo3() {
var accumulatedFiles = [],
filmEmails = [];
for (var i = 0; i < filesNamed[0].length; i += 1) {
filmEmails = [];
for (var j = 0; j < emailData.length; j += 1) {
if (emailData[j][1] == filesNamed[0][i]) {
filmEmails.push(emailData[j]);
}
}
accumulatedFiles.push({title: filesNamed[0][i], emails: filmEmails});
}
}