不同列中值的动态分布

Dynamic distribution of values in different columns

  1. 我们每个学期都有不同数量的学生。它在 (A) 列 "students" 中。根据学生的数量,我们有或多或少的 "teachers",它们在 (B) 栏中。所以,他们也是不固定的。

  2. 这些学生在学期中完成了六个固定模块。他们必须通过不同老师的每个模块,所以他们不能重复。而且老师的学生人数一定要均衡,不需要是一个精确的近似分布。

  3. 然后我用模块创建了学生和老师列表以及 table。使用函数 "COUNTA" 我知道我在每个列表中有多少项目,并使用函数 "OFFSET" 我将学生的名字移动到模块 "matrix" 的第一列。这两个列表,如果它们在末尾添加了名称,都会修改矩阵。

  4. 我需要的是在模块的列中分配教师,但最多只能分配最大数量的学生,并在结束时重复该序列。例如,我在 (F2) 中使用了一个公式 - 使用 Arrayformula 和 ISBLANK - 其中 (B) 列中列出的八位教师分布在 (F - 模块 1) 列中,但它停在最后一位。我需要此分布继续重复,直到 E 列中的最后一个学生 (T1, T2, T3,...,T8, T1, T2, T3,...)

  5. 此外,我在其他模块中也需要这个分布,但是下面从"teacher below"开始(下面一行,只有第一行),如示例工作表:在模块 2 中,从教师 2 开始;在模块 3 和老师 3 中,依此类推,直到模块 6。(在模块 2 中:例如:T2、T3、T4、...、T8、T1、T2、T3、...)

  6. 定稿,应该是我在(A)列添加学生或(B)列添加教师时,矩阵会动态调整

除了我得到的,我不知道还能去哪里,非常欢迎任何帮助。我认为通过 Google App Script 会更可行,到目前为止我已经阅读过,但是我必须从头开始研究该领域。但是好吧,如果这是解决这个问题的方法。

Google Sheet Example

是的,这可以通过 Google Apps 脚本来完成。

在 JavaScript 中,您可以按照以下方式实施某些内容:

var array = [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]];
var teacherCounter = 0;
var modules = 6;
var teachers = 8;
var students = array.length;

for (var i = 0; i < modules; i++) {
  teacherCounter = i;
  for (var j = 0; j < students; j++) {
    if (teacherCounter < teachers) {
      array[j][i] = "T" + (teacherCounter + 1);
      teacherCounter++;
    } else {
      teacherCounter = 0;
      array[j][i] = "T" + (teacherCounter + 1);
      teacherCounter++;
    }
  }
}

其中returns以下数组:

array = [["T1", "T2", "T3", "T4", "T5", "T6"],["T2", "T3", "T4", "T5", "T6", "T7"], ["T3", "T4", "T5", "T6", "T7", "T8"]];

这就是您要找的吗?

如果首选公式,在 F2 中:

=ArrayFormula(vlookup(mod(row(indirect("a1:a"&counta(A2:A)))+transpose(ROW(indirect("a1:a"&counta(F1:1))))-2,counta(B2:B))+1,{row(B2:B)-1,B2:B},2,false))