根据单元格背景颜色过滤表格,并将这些值作为行数据复制到第二张表格中

时间:2017-03-12 17:05:15

标签: google-apps-script

瓦特 您好,

我是一名教师,我正在努力改进我用来评分学生的表格。我提出了一个简单的例子here,其中不包含原始公式或脚本。

我的示例电子表格有两张(标签)。第一个包含学生姓名及其每个科目的相应测试结果数据。第二张表包含一个名称列表。

我正在寻找一个脚本来扫描此工作表以查找具有特定背景颜色的单元格。这些细胞半随机分布在几列中。脚本还应将这些单独的值转换为一组行数据,因此可以将其粘贴到第二个工作表上。该脚本扫描第二个工作表以获取正确的名称,并将值粘贴为一行数据。

这是怎么回事?

感谢您的回复, Jof。

到目前为止

编辑:代码:

// function below is not yet selecting the right name to paste grade-values behind. First i need to get the filtering to work.

function collectGrades() {
  var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Input');
  var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Desired-output');
  var allValues = sourceSheet.getRange(6,2,sourceSheet.getLastRow(),7);
  var allBackgroundColorValues = allValues.getBackgrounds();
  var Grades = findGrades(allValues, allBackgroundColorValues);

  targetSheet.getRange(3,2).setValues(Grades); //select cell B3 on sheet 2 and fill with the results 
}  

function findGrades(allValues, allBackgroundColorValues) {
  for(var i=0, iLen=allValues.length; i<iLen; i++) {
    if(AllBackgroundColorValues[i] != '#ffffff') {
      return allValues[i];
    }
  }
}


// this function should:

// - scan the input sheet column B through H searching for relevant data by filtering for background color
// - collect this data into a single row of data
// - scan the output sheet column A for a match with input sheet B2
// - paste the data behind the right student name

1 个答案:

答案 0 :(得分:2)

这就是你想让循环看起来像什么的。它是从二维范围获得的二维阵列。高度为sourceSheet.getLastRow(),宽度为7列。 Google Apps脚本的一个奇怪之处在于getValues即使在其一列或一行的情况下也始终返回二维区域。在执行setValues()时,您将再次遇到此问题。

function collectGrades() 
{
  var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Input');
  var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Desired-output');
  var allValues = sourceSheet.getRange(6,2,sourceSheet.getLastRow(),7);
  var allBackgroundColorValues = allValues.getBackgrounds();
  for(var rowidx=0; rowidx<allvalues.length; rowidx++) 
  {
    for(var colidx = 0; colidx < 7; colidx++)
    {
      if(allvalues[rowidx][colidx]!=='#ffffff')
      {
        //This is where you do whatever it is you do with non white backgrounds.
      }
    }
  }

}