选择项目后,从验证列表中删除项目

时间:2018-06-07 10:58:27

标签: google-apps-script google-sheets

我正在尝试创建一个修订会话[注册系统] simple test version here,以便在学校中使用。 有一列未分配的学生和一列分配的学生。这用作验证下拉列表框的源。

教师可以从下拉列表中选择一名学生进行注册。 当一个学生被选中后,通过将其从教师中移除而对其他教师不可用,并且他们的名字被添加到分配的列表中。

如果教师从列表中删除学生,学生将被移回未分配的栏目,允许其他教师选择他/她。

我已经取得了一些进展,可以从未分配的列表中删除学生并将其添加到已分配的列表中。

我正在努力进行解除分配工作。

如果教师从他们的名单中删除了一名学生,我认为应该这样做:

1-从所有教师选择的所有学生的网格中制作一个扁平的阵列。 2-在分配的列中创建所有学生的数组。

3-学生不在所有教师的网格阵列中但在已分配的学生列表中是刚刚删除的学生,将该学生从已分配中移除并将其添加回未分配的列。

该函数由onedit触发器事件触发。 出于某种原因,我用来展平数组的函数不起作用,即使记录输出表明它应该。

我的代码如下,(1)任何人都可以看到我做错了吗? (2)看到一个更好的方法来做我想要完成的事情? (我的方式似乎很长很啰嗦)

function flatten(arrayOfArrays)
{
  Logger.log("concat");   
  var array =  [].concat.apply([], arrayOfArrays);
  return array;
}

function search(searchString) //returns array row index
{
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var column =11; //column Index   
    var columnValues = sheet.getRange(1, column, sheet.getLastRow()).getValues(); //1st is header row
    var searchResult = -1;
    for (var row = 1; row < columnValues.length; row ++)
    {
      if (columnValues[row][0]==searchString)
      {
        searchResult = row;
      }
    }

    return searchResult;
}

function cellEdited(e)
{

}
function studentAllocated(e) 
{
  var range = e.range
  var name = range.getValue();
  var row = search(name) +1;
  //remove name from to allocate column
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sheet.getRange("K"+row);
  cell.deleteCells(SpreadsheetApp.Dimension.COLUMNS);
}

function studentDeallocated() 
{
  Logger.log("SDeallocated2");
  //get all the names in the range of teachers
  //compare with all the names in the assigned col
  //the name that is not in the range of teachers but is in assigned col is the name that must be returned
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var assigned = sheet.getRange(2,12,sheet.getLastRow()).getValues();
  var values = sheet.getRange(2,1,sheet.getLastRow(),3).getValues();//get all teachers registers
  Logger.log(values);
  var name = ""
  Logger.log(flatten(assigned))
  var nassigned = flatten(assigned);
  var nvalues = flatten(values);
  Logger.log("flat");
  Loggger.log(nassigned);

  var name = "";

  for (var v=0; v< values.length; v++)
  {
    var found = false;
    for (var a=0; a< assigned.length; a++)
    {
      Logger.log("loop iter: "+ a);
      if(values[v]==assigned[a])
      {
        Logger.log("found name:" +values[v] );
        found == true;
      }
    }
    if (found == false);
    name = values[v];
    break;

  //add name back to to allocate col
  sheet.getRange(1, 11, sheet.getLastRow()).setValue("name");
  }
}


function search(searchString) //returns array row index
{
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var column =11; //column Index   
    var columnValues = sheet.getRange(1, column, sheet.getLastRow()).getValues(); //1st is header row
    var searchResult = -1;
    for (var row = 1; row < columnValues.length; row ++)
    {
      if (columnValues[row][0]==searchString)
      {
        searchResult = row;
      }
    }

    return searchResult;
}

1 个答案:

答案 0 :(得分:0)

如果您可以为所有已分配的单元格生成验证错误,则可以不使用任何脚本执行此操作:

  1. 在A栏:列出所有学生。
  2. 在单元格B1中输入公式 @Html.DropDownListFor(model => model.ProductName, new SelectList(Model.ProductsList, "ProductID", "ProductName"), new { id = "Productslist", @class = "GreenDropDownListStyle", @datastyle = "dropdown", @onchange = "FillProduct()" }) 。 B栏将包含所有未分配的学生。
  3. 在C栏:C中,所有作业都是从教师那里引用的。细胞
  4. 老师&#39;单元格根据B:B范围添加列表验证。
  5. 如果您不想要此错误,您仍然可以为每位教师制作单独的验证列表,包括他的学生以及所有未分配的学生。

    一个例子是here。这两种方法都在单独的表格中。

    编辑:我刚注意到每位老师都应该有一份学生名单。在这种情况下,您需要将每位教师的列表条目视为单独的教师。没有验证错误的方法需要为每个教师的列表条目保持单独的验证列表(例如,3个教师* 5个条目* 9个学生将生成135个验证列表条目)。