记录2d数组中的重复值

时间:2018-05-30 11:58:42

标签: javascript google-apps-script google-sheets

我试图优化整个学校的时间表。我目前的时间表是以表格形式组织的。教师姓名缩写是每列的标题,每行对应30个课程周的单个教学期。每个单元格都包含一个类的名称。

目前我正在寻找两名教师分开的课程。

我正在尝试创建一个应用脚本,如果它出现在当前列之外的任何地方,则会记录该类名称(即同一个班级由不同时间的2位或更多不同教师讲授)

我知道嵌套循环并不是效率最低的方法,但我只是想快速将某些东西放在一起以完成工作。不幸的是,此代码的使用时间超过了允许的最长时间。阵列只有30行,大约56列,所以我不明白它为什么花了这么长时间。 (不能看到任何关于我的循环显然无限的东西)

有人可以帮忙吗? :)

function splitClassLocator() 
{
  //copy the sheet to a 2d array.
  //(1)descend through each column from vertical idx 3 to period6 idx36
    //(2)start at horiz idx 1, descend through each item vertically. 
      //if item from loop 1 matches item from loop 2 and loop 1 vertical index != loop 2 vertical index
         //log the item (split class)

  //GET THE DATA     
  var sh0 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var range = sh0.getDataRange();
  var data = range.getValues();

  //COMPARE
  //main row mr, main col mc V compare row cr, compare col cc
  Logger.log("Rows = " + data.length + "cols = " + data[0].length);

  for (var mr = 2; mr < data.length; mr ++)
  {
    for (var mc = 1; mc < data[0].length; mc ++)
    {
      for (var cr = 2; cr < data.length; cr ++)
      {
        for (var cc = 1; cc, data[0].length; cc ++)
        {
          if (mc != cc) // if it's not comparing classes belonging to the same teacher
          {
            if ((data[mr][mc] != undefined) || (data[mr][mc] != null) || (data[mr][mc] != ""))
            {
              if (data[mr][mc] == data[cr][cc])
              {
                Logger.log(data[mr][mc]);
              }
            }
          }
        }
      }
    }
  }


}

2 个答案:

答案 0 :(得分:0)

这样可以更好一点,扁平化可以制作2个单维数组,一个是要检查的老师,另一个是所有其他时间表的组合。

虽然仍然需要很长时间:

function splitClasses()
{
  var sh0 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[1];
  var range = sh0.getDataRange();
  var data = range.getValues();

  var rows = data.length;
  var cols = data[0].length;  

  for (var col = 1; col < cols; col ++)
  { 
    var teacherTT = [];
    var othersTT = [];    
    for (var row = 2; row < rows; row ++)
    {
      teacherTT.push(data[row][col]);
    }


    for (var oCol = 1; oCol < cols; oCol ++)
    {
      for (var oRow = 2; oRow < rows; oRow ++)
      {
        if (col !=oCol)//dont add current teacher TT to others TT
        {
          othersTT.push(data[oRow][oCol]);
        }
      }
    }

    //Logger.log(othersTT);
    var tLength = teacherTT.length;
    var oLength = othersTT.length;

    Logger.log("tL" + tLength);
    Logger.log("oL" + oLength);

    for (var t = 0; t < tLength; t ++)
    {
      //Logger.log("t "+t);
      for (var o = 0; o < oLength; o ++)
      {
        if (teacherTT[t] != undefined ||teacherTT[t] != null || teacherTT[t] != "" || teacherTT[t] != " ")
        {
          if (teacherTT[t])
          {
            if (teacherTT[t] == othersTT[o])
            {
              //Logger.log("o "+o);
              Logger.log(teacherTT[t]);
            }
          }
        }
      }
    }


  }

}

答案 1 :(得分:0)

不是在比较后丢弃信息,而是存储并使用它!欢迎来到非阵列世界!

您声明的目标是找到拥有两位以上教师的课程。因此,您需要做的最小值是通过阵列在单次行程中计算此信息。

function countTeachersPerClass() {
  const schedule = SpreadsheetApp.getActive().getSheetByName("somename").getDataRange().getValues();
  const headers = schedule.shift();
  const numTeachers = headers.length;
  // Store classes as properties in an Object.
  const classes = {};

  // Read the schedule array.
  // Assumption: time is in index 0, classes in all other.
  schedule.forEach(function (period) {
    var name = period[0];
    // Store each class in this period.
    for (var teacherIndex = 1; teacherIndex < numTeachers; ++teacherIndex) {
      // Have we seen this class? If no, initialize it.
      var classID = period[teacherIndex];
      if (!classes[classID])
        classes[classID] = {teachers: {} };
      // Add this teacher to its list of teachers.
      var tID = headers[teacherIndex];
      if (!classes[classID].teachers[tID])
        classes[classID].teachers[tID] = {periods: []};

      // Add this period for this teacher.
      classes[classID].teachers[tID].periods.push(name);
    } //End for loop over columns in a row.
  }); // End forEach over schedule's rows.

  // Log the object (in Stackdriver, for easy review and interactivity).
  console.log({message: "Built classes  object", input: schedule, result: classes, teachers: headers});

  // Make a report from it.
  const report = [["Class ID", /* other headers */]];
  for (var cID in classes) {
    // This particular report is for class with more than two teachers.
    if (Object.keys(classes[cID].teachers).length > 2) {
      var row = [cID];
      /** Push info to the row, perhaps with just the names
         of the teachers, or also including number of
         periods per each teacher, etc. */;
      // Add the completed report row to the report.
      report.push(row);
    }
  }

  // Log the report.
  console.info({message: "Report", report: report});
}

你可以通过为每个类对象添加更多属性而不仅仅是teachers来获得更多,例如跟踪平均连续教学时间(即经常选择教师的类),但我将其作为练习留给读者:)