问题描述
我有一个函数可以一次完成我想要的一行。现在我想将它应用于多行,所以我尝试使用 forEach 循环。我没有抛出错误,但我也没有得到我想要的! (单元格没有任何输出,Logger.log 只显示 Range)
我正在尝试将员工一周工作的工作列表(从一行中)与可用工作的主要列表进行比较,然后仅将工作工作列表返回到特定单元格中的电子表格。
电子表格中的这一行不仅仅是其中的工作,这就是我每提取三个项目的原因。一些单元格中也有不止一个工作代码。
初始一行函数:
/**
* 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,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);
}
});
参考: