微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

谷歌脚本中的 forEach 循环

如何解决谷歌脚本中的 forEach 循环

我有一个函数可以一次完成我想要的一行。现在我想将它应用于多行,所以我尝试使用 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);
    }
});

参考:

forEach() JavaScript

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。