Date 将日历上的日期与其他字段匹配

Date 将日历上的日期与其他字段匹配,date,if-statement,google-apps-script,google-sheets,Date,If Statement,Google Apps Script,Google Sheets,好的,我的页面上有一个日历,每天都是该日期的格式化版本,例如 Jan 2021 1 2 3 4 5 6 7 8 etc.. 因此,1单元格将包含1/1/2021(但格式仅显示“1”[d]) 我在该页面上还有一个单元格(K5),供用户输入日期,例如:[1/1/2021] 我想要的是一个脚本,如果它与用户输入单元格相匹配,它可以更改日历中一天的边框颜色 守则: function onEdit(e) { var ss = SpreadsheetApp.getActive(); var s

好的,我的页面上有一个日历,每天都是该日期的格式化版本,例如

Jan 2021
1  2  3  4
5  6  7  8
etc..
因此,1单元格将包含1/1/2021(但格式仅显示“1”[d]) 我在该页面上还有一个单元格(K5),供用户输入日期,例如:[1/1/2021]

我想要的是一个脚本,如果它与用户输入单元格相匹配,它可以更改日历中一天的边框颜色

守则:

function onEdit(e) {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var date = sheet.getRange("K5").getValue();
if (e.range.getValue()== date) {
e.range.setBorder(true, true, true, true, true, true, "red", SpreadsheetApp.BorderStyle.solid); }
};
这是行不通的,我想不出一种方法可以让代码对日历中的每个单元格都起作用(有2年的时间,所以超过1000个单元格)。 它不需要是onEdit,我只是测试看看实际的setboorder函数是否工作(它确实工作) 此外,我不能使用条件格式,因为我已经用它来更改其他内容的bg和字体颜色(而且无论如何也没有更改边界颜色的选项)

如果您想看一看,看看您能做些什么,我已经用just Jan制作了一个迷你版:
您可以执行以下操作:

  • 使用获取范围内的所有值
  • 迭代结果2D数组中的所有值
  • 对于每个值,检查(1)值是否为a(例如,使用),以及两个日期是否来自同一天(例如,执行)
  • 如果两个条件都满足,则设置边界
代码段:
查找所有日期的另一种方法是使用公式在不同的表格中显示日期及其地址。此公式将为您的假期输出一系列日期及其地址。然后可以使用onEdit()脚本读取它,将边框放在正确的地址上:

公式:

=ARRAYFORMULA(IFERROR(QUERY(SPLIT(FLATTEN(N(Calendar!E9:AY)&"|"&ROW(Calendar!E9:AY)&"|"&COLUMN(Calendar!E9:AY)&"|"&LEN(TO_TEXT(Calendar!E9:AY))),"|",0,0),"select Col1,Col2,Col3 where Col4<3 and ("&TEXTJOIN(" or",TRUE," Col1="&FILTER(Calendar!BE28:BE100,Calendar!BE28:BE100<>""))&")")))

=ARRAYFORMULA(iError(查询(拆分(展平)(N(Calendar!E9:AY)&“|”&行(Calendar!E9:AY)&“|”&列(Calendar!E9:AY)&“|”&列(TO_TEXT(Calendar!E9:AY)),“|”,0,0),“选择Col1、Col2、Col3,其中col4至少可以再添加一个月(可能是两个月)因此,我可以知道日历在工作表上的位置是否有图案?确保它与真实的东西匹配。哈哈,希望你准备好了,完成了!感谢奇妙的解决方案@MattKing,它工作得很好。我想知道将列表中没有的日期的颜色设置回黑色会有多困难。目前,dat一旦日期被删除,E将保留其红色边框。@JoeW我添加了一行代码,在循环遍历假期并将其标记为红色之前清除所有边框。我还取消了添加日期以便OneEdit运行的条件。这样,清除日期也将运行该功能。太棒了,你真是个天才!似乎正在运行p非常好,非常感谢!
=ARRAYFORMULA(IFERROR(QUERY(SPLIT(FLATTEN(N(Calendar!E9:AY)&"|"&ROW(Calendar!E9:AY)&"|"&COLUMN(Calendar!E9:AY)&"|"&LEN(TO_TEXT(Calendar!E9:AY))),"|",0,0),"select Col1,Col2,Col3 where Col4<3 and ("&TEXTJOIN(" or",TRUE," Col1="&FILTER(Calendar!BE28:BE100,Calendar!BE28:BE100<>""))&")")))
function onEdit(e){
  holidayBorders(e);
}

function holidayBorders(e){
  var sheet = e.range.getSheet();
  if(e.value && sheet.getName()=='Calendar' && e.range.getColumn()==57 && e.range.getRow() >= 28){
    SpreadsheetApp.flush();
    Utilities.sleep(10000);
    var datasheet = e.source.getSheetByName('DATA');
    var rcs = datasheet.getRange('AQ3:AR').getValues().filter(e=> e[0]);

    for (let i=0;i<rcs.length;i++){
      sheet.getRange(rcs[i][0],rcs[i][1]).setBorder(true, true, true, true, true, true, "red", SpreadsheetApp.BorderStyle.solid);
    }
  }
}