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 触发器上手动添加该函数,这样只要在电子表格上进行编辑,该函数就会自动 运行。
之前:
脚本后运行:
参考:
范围 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 触发器上手动添加该函数,这样只要在电子表格上进行编辑,该函数就会自动 运行。
之前:
脚本后运行:
参考: