繁体   English   中英

谷歌表格应用程序脚本过滤器返回空数组

[英]Google sheets apps script FILTER returning empty array

表“主要”包含所有生产数据,如生产日期、机器、产品、生产数量等。在另一张表“AT Guidecard Tracking”中,我正在输入生产日期和机器。 我希望第三列以下拉列表的形式自动提供针对输入的机器和生产日期组合运行的产品。 同一天同一台机器上可能有两个或多个产品。 我在应用程序脚本中编写了以下代码:

// Get active sheet 
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
         
var listMain = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Main");
  
// Get active cell in active sheet
var activeCell = ss.getActiveCell()

if(activeCell.getColumn() == 2 && activeCell.getRow() > 1 && ss.getName() == "AT Guidecard Tracking"){
    
    activeCell.offset(0,1).clearContent().clearDataValidations();
    
    if(activeCell.isBlank() == false){
      
      var machine = activeCell.getValue(); // Col 2
      var prodDate = activeCell.offset(0,-1).getValue(); // Col 1
      //Logger.log(prodDate);

      // Filter main proudction data based on machine and date 
      var MainData = listMain.getRange(2,1,listMain.getLastRow()-1,13).getValues();
      //Logger.log(MainData);

      // compute prod type using FILTER
      var prodTypeList = MainData.filter(function(item){
        return item[0] == prodDate && item[1] === machine; 
      })

      var distinct = (value,index,self) => {
          return self.indexOf(value) === index;
        }     
      
      var prodTypeValidationList = prodTypeList.map(x => x[3]).filter(distinct).sort();
      
      var prodTypeValidationRule = SpreadsheetApp.newDataValidation().requireValueInList(prodTypeValidationList).setAllowInvalid(false).build();      
      
      // Apply validation rule to adjacent cell using offset
      activeCell.offset(0,1).setDataValidation(prodTypeValidationRule);      
      
      
    }    
      
}

但是,当我运行它时,我在 Col 3(数据验证)中得到一个空列表。 工作表“主要”和“AT Guidecard Tracking”中的日期列都被格式化为日期。

例如,我在工作表“AT Guidecard Tracking”和 Machine MS-02中输入日期19/07/2021 (存储在变量 prodDate 中)。 此组合的“主要”工作表中有相应的条目。 当我调试并查看存储在变量MainData上的数据时,日期完全匹配。 (见附图)。

在此处输入图像描述

为什么过滤器返回一个空数组?

我猜这永远不是真的item[0] == prodDate因为一个 Date() object 永远不能等于另一个 Date() object 但是如果你比较 valueOf() 或 getTime() 那么你可以做那种一个对比。

尝试这个:

var prodDate = new Date(activeCell.offset(0,-1).getValue()).valueOf(); // 第 1 列

然后尝试new Date(item[0]).valueOf() == prodDate

请注意两个日期的日期时间完全相同

要回答您的问题:

let dt = new Date();
let today = new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();
let yesterday = new Date(dt.getFullYear(),dt.getMonth(),dt.getDate() - 1).valueOf();

暂无
暂无

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

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