首页 > 解决方案 > 匹配数组的返回索引不起作用 - Javascript Google Apps 脚本

问题描述

我有一个电子表格,第 1 行在每个单元格中都有日期

只要该列与今天的日期匹配,我就想返回列号。第一个标题从单元格 B1 开始。

我正在使用以下内容,我可以让它工作,但是当我做'return i'时,它总是返回'0'。

function getColumnIndex() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var lastColumn = sheet.getLastColumn();
  var data = sheet.getRange(1,2,1,lastColumn).getValues(); //create an array of data from row 1
  for (var i = 0; i <= data.length; i++) {
    var dateToday = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy")
    if (data[i] == dateToday) {break};
    {  
      return i;
    }
  }
}

现在,如果我将最后一行“return i”切换为“return dateToday”,该函数将起作用,它将返回正确的日期,因此我知道它匹配正确(如果我将行单元格更改为其他值,它将返回这些值,如果它火柴)。当我输入“return i”时,我只是无法让它吐出索引号。

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


问题/解释:

  1. var data = sheet.getRange(1,2,1,lastColumn).getValues();返回一个二维数组。

结果,data[i]返回一个实际引用该行的一维数组。要解决此问题,请将数组展平以将其转换为一维:

var data = sheet.getRange(1,2,1,lastColumn).getDisplayValues().flat();

  1. 您的if条件在第一次迭代时执行,i=0因为您在其后放置了一个分号;。此外,不需要,因为在语句break之后不会执行任何操作:return

替换

if (data[i] == dateToday) {break};
{  
  return i;
}

if (data[i] == dateToday) 
{  
  return i;
}

  1. 当您使用日期比较时,您需要使用getDisplayValues()以确保您正在比较显示的值而不是日期的值。

解决方案:

function getColumnIndex() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var lastColumn = sheet.getLastColumn();
  var data = sheet.getRange(1,2,1,lastColumn).getDisplayValues().flat(); //create an array of data from row 1
  
  for (var i = 0; i <= data.length; i++) {
    var dateToday = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy")    
    if (data[i] == dateToday) 
    {  
      return i;
      // return i+2; // if you want to get the column number instead.
    }
  }
}

记住i指的是数组的位置。在 JavaScript 中,数组中的索引从0. 此外,您的数据从第二列开始。如果您希望脚本返回列数,请更改return ireturn i+2.


推荐阅读