VLOOKUP 使用日期作为搜索键(但忽略日期)

VLOOKUP using a date as the search key (but ignoring the day)

范围 A2:A 包含月份,其中每个月使用该月的第一天。允许用户在输入数据时输入该月内的任何一天。用户输入日期的范围由命名范围“EAR_DATES_RNG”定义。每个月都有相应的当月收入汇总。

下面是一个示例:

User Input:
1/11/2017 - 0
2/9/2017 - 0
3/21/2017 - 0

Summary:
1/1/2017 - 0
2/1/2017 - 0
3/1/2017 - 0

以前,我有一个注释,强制用户也使用每个月的第一天进行输入,但我想释放它。但是,这导致我的 VLOOKUP() 停止工作,因为它之前使用摘要日期来查找相应的用户输入:

=ARRAY_CONSTRAIN(ARRAYFORMULA(IFERROR(VLOOKUP(A2:A&" "&$A,{EAR_DATES_RNG&" "&EAR_NAMES_RNG,EAR_AMOUNTS_RNG},2,false),"")), IF(COUNT(A2:A)=0,1,COUNT(A2:A)),1)

我怎样才能让 VLOOKUP 忽略该月的第几天?

或者当我在公式中创建数组时,也许有一种方法可以使用 EOMONTH() 技巧以某种方式将用户输入日期转换为本月的第一天,但​​是也许我使用命名范围的事实会给我克服另一个问题。

但是,我可以看到一个解决方案,它需要一个帮助列来转换 EAR_DATES_RNG 中的所有日期,然后公式使用转换后的范围创建数组,但我想避免帮助列(如果可能)。

感谢我能得到的任何帮助!

截图示例:

输出:

[

输入:

1 月和 3 月用户输入不使用该月的第一天,而 2 月和 4 月使用。因此,在第一个图像中,一月和三月的值在 C 列中为空白,而二月和四月显示出来。

我的 VLOOKUP() 在第一张图片的 C 列中,应该在第二张图片中获取 G 列的相应值。

尝试:

=ARRAY_CONSTRAIN(ARRAYFORMULA(IFERROR(VLOOKUP(TEXT(A2:A, "m/1/e")*1&" "&$A, 
 {EAR_DATES_RNG&" "&EAR_NAMES_RNG, EAR_AMOUNTS_RNG}, 2, 0))), 
 IF(COUNT(A2:A)=0, 1, COUNT(A2:A)), 1)

或:

=ARRAY_CONSTRAIN(ARRAYFORMULA(IFERROR(VLOOKUP(A2:A&" "&$A, 
 {TEXT(EAR_DATES_RNG, "m/1/e")*1&" "&EAR_NAMES_RNG, EAR_AMOUNTS_RNG}, 2, 0))), 
 IF(COUNT(A2:A)=0, 1, COUNT(A2:A)), 1)

这是您需要的功能的脚本版本。

function firstOfTheMonth() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  //Gets the values of column A until the last row with data
  var range = sheet.getRange(2,1, sheet.getLastRow() - 1, 1);

  //Changes the date values of column A into MM-YYYY-1
  // You need to define your TimeZone on Utilities.formatDate(new Date(y), "YOUR TIMEZONE HERE", "MM-1-yyyy")
  var val = range.getValues();
  var newval = val.map(x => x.map(y => Utilities.formatDate(new Date(y), "GMT+8", "MM-1-yyyy")));

  console.log(newval);
  range.setValues(newval); 
}

您可以在 onEdit 触发器上手动添加该函数,这样只要在电子表格上进行编辑,该函数就会自动 运行。

之前:

脚本后运行:

参考:

https://developers.google.com/apps-script/reference/utilities/utilities#formatDate(Date,String,String)