【问题标题】:Return index of matched array not working - Javascript Google Apps Script匹配数组的返回索引不起作用 - Javascript Google Apps 脚本
【发布时间】:2020-10-14 23:21:44
【问题描述】:

我有一个电子表格,第 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'时,我无法让它吐出索引号。

【问题讨论】:

  • 这是日期格式问题,所以您的比较不匹配?要对此进行测试,而不是“return i”,您是否可以尝试返回“data[2]”,例如,查看该格式是否与您执行“return dateToday”时得到的格式相匹配?只是一个想法......另外,我最近没有做太多编码 - 在您跳出 FOR 循环后,i 的值是否有可能丢失(设置为零)?

标签: javascript google-apps-script google-sheets


【解决方案1】:

问题/说明:

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

因此,data[i] 返回一个实际引用行的一维数组。为了解决这个问题,flatten 将数组转换为一维:

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

【讨论】:

  • 太棒了,我读到了一些关于它产生二维数组的信息,但不知道如何处理该信息——这就是为什么每当它匹配时我总是得到 0 的索引返回——因为第一行是 0 所以它给出了正确的返回索引,我只是不知道我在做什么。还要感谢有关删除分号和移动中断的指针。我今天花了几个小时研究如何在不了解 GAS 的情况下独自完成这项工作,但有趣的是,知道自己在做什么的人可以立即查看并弄清楚
  • @823g4n8901 很高兴它能帮助您解决问题。这些错误可能发生在任何人身上。不用担心 :) GAS 需要一点练习,你就会到达那里。 :)
  • 1.break 语句无法访问。一旦return 执行,break 就没有用了。 2.你应该提到你为什么使用getDisplayValues()
  • @TheMaster 真的,我的错 :) 谢谢
【解决方案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")];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多