Google 电子表格循环和 IF 语句:循环遍历同事列表并将他们添加到轮换计划中

Google Spreadsheet Loop & IF statement: Loop through co-worker list and add them to a rotation schedule

编辑 - 已解决

我必须为明年的同事制定轮换计划。一些同事有标准的休息日,我不想在那些日子安排他们。

这是我想要得到的手动结果。

示例:顾问 A 在星期一不工作,所以我不希望在星期一将顾问 A 添加到日程表中。 然后,我希望将顾问 B 添加到日程表中作为补充。顾问 A 将在星期二排在下一个,等等。接下来是顾问 C,但顾问 C 在星期三不工作。因此,我们需要在星期三带顾问 D,在星期四带顾问 C,依此类推。当我们在F栏的最后一个顾问时,需要从顾问A重新开始。

我试过各种公式,比如if语句和arrayformula。但据我所知,无法仅使用公式循环遍历 F 列。

我不确定这是否完全清楚我想在这里实现的目标,我被卡住了

我正在使用附加组件将日程安排发送到每个人的议程,这也是我喜欢将其自动化的原因,因为它对我有很大帮助。

我确实尝试了一些编码,但我不是编码员,我不确定分享我的失败是否有帮助但这就是我到目前为止所尝试的:

function Loop() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var EndRow = ss.getLastRow();

  for (var i = 2; i <= EndRow; i++) {
    var Day = ss.getRange(i,2).getValue();
    var Consultants = ss.getRange(i,6).getValue();
    var Off = ss.getRange(i,7).getValue ();
    var Count = ss.getRange(i,8).getValue();

    if(Day == Off){
      ss.getRange(i, 3).setValue(Consultants)
    }else{
      ss.getRange(i, 3).setValue(Consultants)
    }
  }
  }

编辑:

我找到了一种不使用应用程序脚本的方法,手动花费了我更多的工作,并首先尝试使用较短的团队列表。 突出显示的黄色单元格是休息日与工作日单元格相同的单元格。所以他们换了。 我确实必须复制粘贴我输入的顾问列表,但如果这是唯一的手动方式,那很好:)

试试这个:

代码:

function myFunction() { 
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var sh = ss.getSheetByName("Sheet1"); 
  var dayCol = sh.getRange("B2:B343").getValues().flat(); //get day column values and convert it to 1d array
  var dayOffCol = sh.getRange("G2:G9").getValues().flat(); //get day off values and convert it to 1d array
  var dayOffColCopy; //initialize copy 
  var consCol = sh.getRange("F2:F9").getValues().flat(); //get consultants values or column F
  var consColCopy; //initialize copy
  var tempArray = []; //storage of final value for column C
  for(var i = 0; i < dayCol.length; i++){  //loop through dayCol values
    var ctr = (i % consCol.length); //used modulo as counter. the value will return to 0 if the value of i is divisible to the length of consCol or in example 8

    //The if statement below will help up reset the value of
    //consColCopy and dayOffColCopy once the values are emptied because of the splice()
    if(ctr == 0){ 
      consColCopy = consCol.slice();
      dayOffColCopy = dayOffCol.slice();
    }
    
    //the loop below will get the first non-matching values of dayCol and dayOffColCopy,
    //the first non-matching values will be removed to the copy variables using splice() 
    //and insert it to tempArray using push()
    for(var j = 0; j < dayOffColCopy.length; j++){ //loop through dayOffColCopy values
      if(dayCol[i] != dayOffColCopy[j]){ 
        tempArray.push(consColCopy.splice(j, 1)); 
        dayOffColCopy.splice(j, 1);
        break; //exit loop
      }      
    }
  }
  sh.getRange(2, 3, tempArray.length, 1).setValues(tempArray); //set the values of temp array to column C
}

示例数据和输出:

注意: 确保使用包含您范围内数据的单元格并更改 sheet 名称。我还在我的代码中添加了注释来解释这个过程。

参考文献: