Google sheets 值在不同列中的动态分布

Google sheets 值在不同列中的动态分布,google-sheets,google-sheets-formula,array-formulas,gs-vlookup,Google Sheets,Google Sheets Formula,Array Formulas,Gs Vlookup,我们每个学期都有不同数量的学生。在(A)栏“学生”中。根据学生人数的不同,我们有更多或更少的“教师”,见(B)栏。因此,它们也不是固定不变的 这些学生在学期中要学习六个固定的模块。他们必须让不同的老师通过每个模块,这样他们就不能重复了。教师必须有一个均衡的学生人数,而不需要精确、近似的分布 然后,我创建了学生和教师的列表以及包含模块的表格。使用函数“COUNTA”,我知道每个列表中有多少项,使用函数“OFFSET”,我将学生的姓名移动到模块“矩阵”的第一列。如果两个列表的末尾都添加了名称,则它们

我们每个学期都有不同数量的学生。在(A)栏“学生”中。根据学生人数的不同,我们有更多或更少的“教师”,见(B)栏。因此,它们也不是固定不变的

  • 这些学生在学期中要学习六个固定的模块。他们必须让不同的老师通过每个模块,这样他们就不能重复了。教师必须有一个均衡的学生人数,而不需要精确、近似的分布

  • 然后,我创建了学生和教师的列表以及包含模块的表格。使用函数“COUNTA”,我知道每个列表中有多少项,使用函数“OFFSET”,我将学生的姓名移动到模块“矩阵”的第一列。如果两个列表的末尾都添加了名称,则它们将修改矩阵

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

  • 此外,我在其他模块中也需要此分布,但以下内容从“下面的老师”(下面一行,仅第一行)开始,如工作表示例中所示:在模块2中,从老师2开始;在模块3中与教师3一起,依此类推到模块6。(在模块2中:例如:T2、T3、T4、…、T8、T1、T2、T3、…)

  • 最后,当我在(a)列中添加学生或在(B)列中添加教师时,矩阵将动态调整

  • 我不知道在什么地方可以超越我所得到的,任何帮助都是非常欢迎的。我认为通过谷歌应用程序脚本将更可行,我已经读到了,但我必须从一开始就开始这方面的研究。但好吧,如果这是解决这个问题的方法


    是的,这可以通过谷歌应用程序脚本完成

    在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++;
        }
      }
    }
    

    这就是你想要的吗?

    是的,这可以通过谷歌应用程序脚本来完成

    在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++;
        }
      }
    }
    

    这就是您想要的吗?

    如果首选公式,在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))
    

    如果首选配方,在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))
    

    是的,我想一定有这样的东西,但在我开始学习谷歌脚本和javascript时,我会保留它。无论如何,非常感谢你的帮助。是的,我想一定有这样的东西,但我会在我开始学习谷歌脚本和javascript时保留它。无论如何,非常感谢您的帮助。Tom,我已将此公式粘贴到F2单元格(并将逗号改为分号),但我收到此错误消息:“VLOOKUP返回超出范围的范围”。我修不好。可能是什么=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])错误意味着vlookup数组中只有一列,而不是两列,因此,当您说vlookup(…2;false)时,它尝试访问第二列并失败。我相信在您的语言环境中,您必须使用反斜杠(\)作为花括号中的水平数据分隔符{},因此公式应该是=数组形式(vlookup(mod(row(indirect)(“a1:a”&counta(A2:a)))+转置(row(indirect)(“a1:a”&counta(F1:1))-2;counta(B2:B))+1;{row(B2:B)-1\B2:B};2;false))。请看Tom,我已将此公式粘贴到F2单元格(并用逗号表示分号),但我收到了这个错误消息:“VLOOKUP返回的范围超出了范围”。我无法修复它。它可能是什么?=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))这个错误意味着你在VLOOKUP数组中只有一列而不是2列,所以当你说VLOOKUP(…2;false)时,它试图访问第二列,但失败了。我相信在你的语言环境中,你必须使用反斜杠(\)作为花括号{}中的水平数据分隔符,所以公式应该是=ArrayFormula(VLOOKUP)(mod(row(indirect)(“a1:a”)&counta(A2:A))+转置(行(间接(“a1:A”和counta(F1:1)))-2;counta(B2:B))+1;{ROW(B2:B)-1\B2:B};2;false))参见