google 脚本中的 forEach 循环
forEach loop in google scripts
我有一个函数可以一次完成我想要的一行。现在我想将其应用于多行,因此我尝试使用 forEach 循环。我没有抛出错误,但我也没有得到我想要的! (没有任何内容输出到单元格,Logger.log只显示范围)
我正在尝试将员工本周工作的工作列表(从一行中)与可用工作的主要列表进行比较,然后 return 仅将工作列表返回到电子表格中特定单元格。
电子表格中的行不仅仅是其中的职位,这就是为什么我每隔三个项目拉一次。有些单元格中也有不止一个工作代码。
初始一行函数:
/**
* Test Returns the job codes assigned for the week
* must be entered like this: =TWOJOBS(CELL("address",B12)&":"&CELL("address",AC12))
* @param {Range} Employee's Info Range
* @return {List} How many days of work per job code
* @customfunction
*/
function TWOJOBS(pRange) {
//get the current active sheet
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FULL YEAR 2021");
//get the Named Range of JOBS
var JobList = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("JOBS");
//get the Job Codes
var jobjob = JobList.getValues();
var jobjobjob = String(jobjob)
//get the length of the Job List
var joblength = jobjobjob.length;
//Logger.log(joblength);
//get the values from the input range
var empData = ss.getRange(pRange);
var empWeek = empData.getValues()[0];
var empDatalst = [];
for(var k=0; k<empWeek.length; k++){
empDatalst.push(String(empWeek[k]).split());
}
/*get every third item in the EmpDatalst array*/
const every_nth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
var empJobs = every_nth(empDatalst, 3);
var indivEmplJobs = [];
var innyEmJojo = [];
for(var i = 0; i<empJobs.length; i++){
//for(var j=0; j<empJobs[i].length; j++){
indivEmplJobs.push(String(empJobs[i]).split(";"));
}
for (var i = 0;i<indivEmplJobs.length;i++){
for(var j=0; j<indivEmplJobs[i].length; j++){
innyEmJojo.push((indivEmplJobs[i][j]).trim())
}
}
var jobsworked = [];
for(var i=0; i<joblength; i++){
if(innyEmJojo.includes(String((jobjob[i])))){
jobsworked.push(String((jobjob[i])));
}
}
然后是多行函数(我已经命名了每周的范围):
/**
* Test Returns the job codes assigned for the week
* Assign this script to a button to get the info for the week
* @param {Range} Employee's Info Range
* @return {List} How many days of work per job code
* @customfunction
*/
function TestWeek29Jobs() {
//get the current active sheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
//get the Named Range of JOBS
var JobList = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("JOBS");
//get the Job Codes
var jobjob = JobList.getValues();
var jobjobjob = String(jobjob)
//get the length of the Job List
var joblength = jobjobjob.length;
//get the named range of the week
var empData = ss.getRangeByName("Week29");
//var empData = ss.getRange("B787:V787");
//get the values in the range
var empWeek = empData.getValues();
var empDatalst = [];
empWeek.forEach(function(person){
//Logger.log(empData.getRow());
for(var k=0; k<empWeek.length; k++){
empDatalst.push(String(empWeek[k]).split());
}//end k for
/*get every third item in the EmpDatalst array because every third is just the job code*/
const every_nth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
var empJobs = every_nth(empDatalst, 3);
var indivEmplJobs = [];
var innyEmJojo = [];
for(var i = 0; i<empJobs.length; i++){
indivEmplJobs.push(String(empJobs[i]).split(";"));
}//end i for loop
for (var i = 0;i<indivEmplJobs.length;i++){
for(var j=0; j<indivEmplJobs[i].length; j++){
innyEmJojo.push((indivEmplJobs[i][j]).trim())
}//end j for loop
}//end i for loop
var jobsworked = [];
for(var i=0; i<joblength; i++){
if(innyEmJojo.includes(String((jobjob[i])))){
jobsworked.push(String((jobjob[i])));
}//end if
}//end for
var text = ""
var row = empData.getRow();
var targetcell = ss.getRange("AA"+row);
for (var j=0; j<jobsworked.length; j++){
if(jobsworked[j] != ""){
text += jobsworked[j]+",";
}//end if
targetcell.setValue(text);
Logger.log(targetcell);
}//end for
}); //end of forEach
}//end of function
如果我偏离了方向或者我只是在 forEach 功能中遗漏了一些东西,谁能帮助指导我?提前致谢。
方法Array.forEach(function(item) {})
会对Array
的每个元素执行一个函数,用item
表示。
在您的实施中:
empWeek.forEach(function(person){
// code here
});
由于 empWeek
现在是一个二维数组,每个元素现在都是一个一维数组,所以 person
现在等于 empWeek[0]
、empWeek[1]
,依此类推,每个都是一维数组。
所以要访问单个单元格值,您需要将索引放入 person
:
for(var k=0; k<person.length; k++){
empDatalst.push(String(person[k]).split());
}
同样在最后一个代码块中,由于您现在将写入多行,因此您需要为每次执行递增 row
,因此您需要在 forEach
函数上放置一个索引范围。 idx
从0开始,每次执行函数加1。
empWeek.forEach(function(person, idx){
var empDatalst = [];
for(var k=0; k<person.length; k++){
empDatalst.push(String(person[k]).split());
}
// code here
var text = "";
var row = empData.getRow()+idx;
var targetcell = ss.getRange("AA"+row);
for (var j=0; j<jobsworked.length; j++) {
if (jobsworked[j] != "") {
text += jobsworked[j]+",";
}//end if
targetcell.setValue(text);
Logger.log(text);
}
});
参考:
我有一个函数可以一次完成我想要的一行。现在我想将其应用于多行,因此我尝试使用 forEach 循环。我没有抛出错误,但我也没有得到我想要的! (没有任何内容输出到单元格,Logger.log只显示范围)
我正在尝试将员工本周工作的工作列表(从一行中)与可用工作的主要列表进行比较,然后 return 仅将工作列表返回到电子表格中特定单元格。
电子表格中的行不仅仅是其中的职位,这就是为什么我每隔三个项目拉一次。有些单元格中也有不止一个工作代码。
初始一行函数:
/**
* Test Returns the job codes assigned for the week
* must be entered like this: =TWOJOBS(CELL("address",B12)&":"&CELL("address",AC12))
* @param {Range} Employee's Info Range
* @return {List} How many days of work per job code
* @customfunction
*/
function TWOJOBS(pRange) {
//get the current active sheet
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FULL YEAR 2021");
//get the Named Range of JOBS
var JobList = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("JOBS");
//get the Job Codes
var jobjob = JobList.getValues();
var jobjobjob = String(jobjob)
//get the length of the Job List
var joblength = jobjobjob.length;
//Logger.log(joblength);
//get the values from the input range
var empData = ss.getRange(pRange);
var empWeek = empData.getValues()[0];
var empDatalst = [];
for(var k=0; k<empWeek.length; k++){
empDatalst.push(String(empWeek[k]).split());
}
/*get every third item in the EmpDatalst array*/
const every_nth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
var empJobs = every_nth(empDatalst, 3);
var indivEmplJobs = [];
var innyEmJojo = [];
for(var i = 0; i<empJobs.length; i++){
//for(var j=0; j<empJobs[i].length; j++){
indivEmplJobs.push(String(empJobs[i]).split(";"));
}
for (var i = 0;i<indivEmplJobs.length;i++){
for(var j=0; j<indivEmplJobs[i].length; j++){
innyEmJojo.push((indivEmplJobs[i][j]).trim())
}
}
var jobsworked = [];
for(var i=0; i<joblength; i++){
if(innyEmJojo.includes(String((jobjob[i])))){
jobsworked.push(String((jobjob[i])));
}
}
然后是多行函数(我已经命名了每周的范围):
/**
* Test Returns the job codes assigned for the week
* Assign this script to a button to get the info for the week
* @param {Range} Employee's Info Range
* @return {List} How many days of work per job code
* @customfunction
*/
function TestWeek29Jobs() {
//get the current active sheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
//get the Named Range of JOBS
var JobList = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("JOBS");
//get the Job Codes
var jobjob = JobList.getValues();
var jobjobjob = String(jobjob)
//get the length of the Job List
var joblength = jobjobjob.length;
//get the named range of the week
var empData = ss.getRangeByName("Week29");
//var empData = ss.getRange("B787:V787");
//get the values in the range
var empWeek = empData.getValues();
var empDatalst = [];
empWeek.forEach(function(person){
//Logger.log(empData.getRow());
for(var k=0; k<empWeek.length; k++){
empDatalst.push(String(empWeek[k]).split());
}//end k for
/*get every third item in the EmpDatalst array because every third is just the job code*/
const every_nth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
var empJobs = every_nth(empDatalst, 3);
var indivEmplJobs = [];
var innyEmJojo = [];
for(var i = 0; i<empJobs.length; i++){
indivEmplJobs.push(String(empJobs[i]).split(";"));
}//end i for loop
for (var i = 0;i<indivEmplJobs.length;i++){
for(var j=0; j<indivEmplJobs[i].length; j++){
innyEmJojo.push((indivEmplJobs[i][j]).trim())
}//end j for loop
}//end i for loop
var jobsworked = [];
for(var i=0; i<joblength; i++){
if(innyEmJojo.includes(String((jobjob[i])))){
jobsworked.push(String((jobjob[i])));
}//end if
}//end for
var text = ""
var row = empData.getRow();
var targetcell = ss.getRange("AA"+row);
for (var j=0; j<jobsworked.length; j++){
if(jobsworked[j] != ""){
text += jobsworked[j]+",";
}//end if
targetcell.setValue(text);
Logger.log(targetcell);
}//end for
}); //end of forEach
}//end of function
如果我偏离了方向或者我只是在 forEach 功能中遗漏了一些东西,谁能帮助指导我?提前致谢。
方法Array.forEach(function(item) {})
会对Array
的每个元素执行一个函数,用item
表示。
在您的实施中:
empWeek.forEach(function(person){
// code here
});
由于 empWeek
现在是一个二维数组,每个元素现在都是一个一维数组,所以 person
现在等于 empWeek[0]
、empWeek[1]
,依此类推,每个都是一维数组。
所以要访问单个单元格值,您需要将索引放入 person
:
for(var k=0; k<person.length; k++){
empDatalst.push(String(person[k]).split());
}
同样在最后一个代码块中,由于您现在将写入多行,因此您需要为每次执行递增 row
,因此您需要在 forEach
函数上放置一个索引范围。 idx
从0开始,每次执行函数加1。
empWeek.forEach(function(person, idx){
var empDatalst = [];
for(var k=0; k<person.length; k++){
empDatalst.push(String(person[k]).split());
}
// code here
var text = "";
var row = empData.getRow()+idx;
var targetcell = ss.getRange("AA"+row);
for (var j=0; j<jobsworked.length; j++) {
if (jobsworked[j] != "") {
text += jobsworked[j]+",";
}//end if
targetcell.setValue(text);
Logger.log(text);
}
});
参考: