特定数据范围的最小和最大行数(取决于单元格值)

时间:2015-05-05 16:28:44

标签: google-apps-script

我有一个提交的表单,并使用日期戳为每个提交生成月份名称。我需要的是一种生成每个月数据的最小和最大行数的方法。因此,如果1月份提交从第1行开始到第13行结束,则feb从14开始,到30日3月30日结束并在36结束。我需要一个脚本来告诉我那些特定的行号。然后,我将使用这些作为单独的数据范围来生成该范围内每一行的月份概览。

下面是我到目前为止所使用的,但结果并不完全正确:

function findCell() 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Votes');
  var lastRowSheet = sheet.getLastRow();
  var DataRange = "$B1:$B" + lastRowSheet.toString();
  var values = sheet.getRange(DataRange).getValues();
  Logger.log(values);
  
  var test = sheet.getRange('B4').getValue();
  Logger.log("test - " + test);

  for (var i = 0; i < values.length; i++) 
    {
     var row = "";
     for (var j = 0; j < values[i].length; j++) 
      {     
      if (values[i][j] == "May") 
        {
        row = values[i][j+1];
        //Logger.log(row);
        Logger.log(i+1);
        }
      }    
    };

  for (var rowMinApr= 0; rowMinApr< values.length ; rowMinApr++ )
        {
        if (values[rowMinApr][0] == "April")
            {
            Logger.log("April min row - " + rowMinApr+1);
            break;
            }
        };
        
  for (var rowMaxApr= values.length -1 ; rowMaxApr>= 0 ; rowMaxApr-- )
        {
          if (values[rowMaxApr][0] == "April")
            {
            Logger.log("April max row - " + rowMaxApr+1);
            break;
            }
        };
        
  for (var rowMinMay= 0; rowMinMay< values.length ; rowMinMay++ )
        {
        if (values[rowMinMay][0] == "May")
            {
            Logger.log("Maymin row - " + rowMinMay+1);
            break;
            }
        };
        
  for (var rowMaxMay = values.length -1 ; rowMaxMay >= 0 ; rowMaxMay-- )
        {
          if (values[rowMaxMay][0] == "May")
            {
            Logger.log("May max row - " + rowMaxMay+1);
            break;
            }
        };

日志显示:

enter image description here

你可以看到它在哪里列出了单元格值为4月的行号,但是当我尝试使用代码查找适用于相关单元格内容的最小和最大行数时,它会抛出一些prett随机数。目前,包含April的单元格是第2行到第15行,May是第16到27行。

2 个答案:

答案 0 :(得分:1)

function findCell() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Votes');
  var lastRowSheet = sheet.getLastRow();
  var DataRange = "$B2:$B" + lastRowSheet.toString();
  var months = sheet.getRange(DataRange).getValues();
  Logger.log(months[0][0] + " begins at row 2");
  var i;
  for(i = 0; i < (months.length - 1); i++) {
    if(months[i][0] != months[i+1][0]) {
      Logger.log(months[i][0] + " ends at row " + (i+2));
      Logger.log(months[i+1][0] + " begins at row " + (i+3));
      }
    }
  Logger.log(months[i][0] + " ends at row " + (i+2));
}

答案 1 :(得分:0)

您正在获取一列数据。返回的二维数组将如下所示:

[['monthName'],['monthName'],['monthName'],['monthName'],['monthName'],['monthName']]

每个内部数组中只有一个元素。因此,每个内部数组的索引号为零。这永远不会改变。

  • 第一行:arrayName [i] [0]
  • 第二行:arrayName [i] [0]
  • 第三行:arrayName [i] [0]
  • 第四行:arrayName [i] [0]

请注意,第二个索引永远不会改变,它始终为零。目前,您有一个内部for循环。您不需要嵌套循环。为什么?因为在内部数组中没有任何东西可以循环。只有一个元素。它始终是零指数。

或者,您可以将二维数组转换为一维数组,因为内部数组中只有一个元素,只使用一维数组。

考虑一下如何“手动”完成此操作。你可以从第一行开始,查看月份,看看它是'月'月。好的,这是'五月',我需要记录第一行是'五月'类别。我不是说这是最好的策略,我没有考虑过所有可能的解决方案。但那是我开始的地方。所以也许有一个'May'月的数组,并记录'May'数组中'May'的所有行号。这个策略每个月都需要一个单独的数组。所以,你每个月都有一个外部for循环,然后是一个内部for循环,它将通过values数组,并进行匹配。

所以,你可以拥有所有月份的数组:

var theMonths = ['Jan','Feb','Mar','Apr', etc];

循环几个月:

for (var i=0;i<theMonths.length;i++) {
  var thisMonthToMatch = theMonths[i];

  //loop through all the values
  for (var j=0;j<values.length;j++) {

    var valueRetrieved = values[j][0];
    if (thisMonthToMatch === valueRetrieved) {
      //Record your info
    };

  };
};