【问题标题】:Google sheets apps script FILTER returning empty array谷歌表格应用程序脚本过滤器返回空数组
【发布时间】:2021-11-26 07:49:33
【问题描述】:

表“主要”包含所有生产数据,如生产日期、机器、产品、生产数量等。在另一张表“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(数据验证)中得到一个空列表。工作表“Main”和“AT Guidecard Tracking”中的日期列都被格式化为日期。

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

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

【问题讨论】:

  • 尝试删除其中一项,看看数据是否返回item[0] == prodDate && item[1] === machine;

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


【解决方案1】:

我猜这永远不会是真的item[0] == prodDate 因为一个 Date() 对象永远不能等于另一个 Date() 对象但是如果你比较 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();

【讨论】:

  • 谢谢!我对比较两个日期有同样的疑问,现在可以了。如果我想检查 new Date(item[0]).valueOf() 是否在 prodDate 和 prodDate 前一天之间,代码将如何更改?
  • @Rock,您必须在 getDate 上用 -1 抵消您的 prodDate 并将其分配给另一个变量。然后比较它是否在新变量和 prodDate 的 valueOf 之间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
相关资源
最近更新 更多