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

Min and Max row numbers for specific data range (cell value dependent)

我提交了一个表单,使用日期戳为每次提交生成月份名称。我需要的是一种为每个月数据生成最小和最大行号的方法。因此,如果 1 月的提交从第 1 行开始到第 13 行结束,2 月从 14 日开始到 30 日结束,3 月从 31 日开始到 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;
            }
        };

日志显示如下:

如您所见,它列出了单元格值为 April 的行号,这很好,但是当我尝试使用代码查找适用于相关单元格内容的最小和最大行号时,它会抛出一些漂亮的东西随机数。当前,包含 April 的单元格位于第 2 至 15 行,May 位于第 16 至 27 行。

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

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

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

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

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

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

想想你会怎么做 "manually"。您可以从第一行开始,查看月份,然后看到它是 'May' 月份。好的,现在是 'May' 月,我需要记录第 1 行在 'May' 类别中。我并不是说这是最好的策略,我还没有考虑过所有可能的解决方案。但这就是我要开始的地方。所以也许有一个 '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
    };

  };
};
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));
}