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() JavaScript