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 名称。我还在我的代码中添加了注释来解释这个过程。
参考文献:
编辑 - 已解决
我必须为明年的同事制定轮换计划。一些同事有标准的休息日,我不想在那些日子安排他们。
这是我想要得到的手动结果。
示例:顾问 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 名称。我还在我的代码中添加了注释来解释这个过程。