【问题标题】:Dynamic distribution of values in different columns不同列中值的动态分布
【发布时间】:2019-07-17 16:53:10
【问题描述】:
  1. 我们每个学期都有不同数量的学生。它在 (A) 栏“学生”中。根据学生的数量,我们有或多或少的“老师”,它们在 (B) 列中。因此,它们也不是固定的。

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

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

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

  5. 1234563 2、从老师2开始;在模块 3 和老师 3 中,依此类推直到模块 6。(在模块 2 中:例如:T2、T3、T4、...、T8、T1、T2、T3、...)
  6. 最后,它必须是当我在 (A) 列中添加学生或在 (B) 列中添加教师时,矩阵将被动态调整。

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

Google Sheet Example

【问题讨论】:

    标签: google-sheets google-sheets-formula array-formulas gs-vlookup


    【解决方案1】:

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

    【讨论】:

    • 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;{行(B2:B)-1;B2:B};2;false))
    • 该错误意味着您在 VLOOKUP 数组中只有一列而不是 2,因此当您说 Vlookup(...2;false) 时,它会尝试访问第二列并失败。我相信在您的语言环境中,您必须使用反斜杠 (\) 作为大括号 {} 中的水平数据分隔符,因此公式应该是 =ArrayFormula(vlookup(mod(row(indirect("a1:a"&counta(A2:A) )))+转置(ROW(间接("a1:a"&counta(F1:1))))-2;counta(B2:B))+1;{row(B2:B)-1\B2:B };2;false)) 见benlcollins.com/spreadsheets/sheets-location
    【解决方案2】:

    是的,这可以通过 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++;
        }
      }
    }
    

    返回以下数组:

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

    这就是你要找的吗?

    【讨论】:

    • 是的,我认为一定有这种方式,但我会保留它,直到我开始学习 google 脚本和 javascript。无论如何,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2014-10-16
    相关资源
    最近更新 更多