繁体   English   中英

返回匹配数组的索引不起作用 - Javascript Google Apps Script

[英]Return index of matched array not working - Javascript Google Apps Script

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

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

我正在使用以下内容,我可以让它工作,但是当我执行“返回 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'时,我无法让它吐出索引号。

问题/说明:

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

因此, data[i]返回一个一维数组,它实际上是指该行。 要解决此问题,请展平数组以将其转换为 1D:

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 i更改为return i+2

function getColumnIndexForToday() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const shsc=2;
  const offset=0;//0 if you want the index from column B 1 if you want the index from ColumnA
  const data=sh.getRange(1,shsc,1,sh.getLastColumn()-shsc+1).getDisplayValues()[0];//assuming format is "MM/dd/yyyy"
  var dObj={};
  data.forEach(function(h,i){dObj[h]=i+offset;});//You really can just do this once and then use it repeatedly
  var dateToday = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy")
  return dObj[Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"MM/dd/yyyy")];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM