Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回匹配数组的索引不工作-Javascript Google Apps脚本_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

返回匹配数组的索引不工作-Javascript Google Apps脚本

返回匹配数组的索引不工作-Javascript Google Apps脚本,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有一个电子表格,第1行的每个单元格都有日期 只要列与今天的日期匹配,我就要返回列号。第一个标题从单元格B1开始 我正在使用下面的命令,我可以让它工作,但是当我改为“returni”时,它总是返回“0” function getColumnIndex() { var spreadsheet = SpreadsheetApp.getActive(); var sheet = spreadsheet.getActiveSheet(); var lastColumn = sheet.get

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

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

我正在使用下面的命令,我可以让它工作,但是当我改为“returni”时,它总是返回“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;
    }
  }
}
函数getColumnIndex(){ var电子表格=SpreadsheetApp.getActive(); var sheet=spreadsheet.getActiveSheet(); var lastColumn=sheet.getLastColumn(); var data=sheet.getRange(1,2,1,lastColumn).getValues();//从第1行创建数据数组 对于(var i=0;i问题/解释:
  • var data=sheet.getRange(1,2,1,lastColumn).getValues();
    返回一个2D数组
  • 因此,
    data[i]
    返回一个实际引用该行的1D数组。要解决此问题,将其转换为1D的数组:

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

  • 如果在第一次迭代时执行了
    i=0
    条件,因为您在它后面加了一个分号
    。此外,不需要
    break
    ,因为在
    return
    语句之后不会执行任何操作:
  • 更换

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

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

  • 在进行日期比较时,需要使用
    getDisplayValues()
    来确保比较的是显示的值 而不是日期的值

  • 解决方案: 函数getColumnIndex(){ var电子表格=SpreadsheetApp.getActive(); var sheet=spreadsheet.getActiveSheet(); var lastColumn=sheet.getLastColumn(); var data=sheet.getRange(1,2,1,lastColumn).getDisplayValues().flat();//从第1行创建一个数据数组
    对于(var i=0;i)这是一个日期格式问题,因此您的比较不匹配吗?要测试这一点,而不是“return i”,您可以尝试返回“data[2]”,例如,查看该格式是否与您执行“return dateToday”时得到的格式匹配?只是一个想法…另外,我最近没有做太多编码-是否有可能I的值丢失(设置为零)在你打破FOR循环之后?太棒了,我读到了一些关于它生成2D数组的内容,但不知道如何处理这些信息——这就是为什么每次匹配时我都会得到0的索引返回值——因为第一行是0,所以它给出了正确的返回索引,我只是不知道我在做什么。也感谢上面的指针去掉分号,移动断点。今天我花了好几个小时研究如何独立完成这项工作,而我对气体一无所知,但有趣的是,知道自己在做什么的人可以立即看到它并计算出来out@823g4n8901很高兴它帮助您解决了问题。这些错误可能发生在任何人身上。无需担心:)GAS需要一点练习,你会成功的。:)1.
    break
    语句无法访问。一旦
    返回执行,
    break
    就没用了。2.你应该提到为什么使用
    getDisplayValues()
    @TheMaster true,my bad:)谢谢
    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.
        }
      }
    }
    
    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")];
    }