Google sheets 查找没有重叠日期的最低值

Google sheets 查找没有重叠日期的最低值,google-sheets,google-sheets-formula,Google Sheets,Google Sheets Formula,我有一个带有标准、开始和结束日期以及值的电子表格。目标是为每个唯一标准和开始日期找到最小值,而不重叠日期(不包括结束日期)。我制作了一个pivot表来简化自己,但我知道可能有一种方法可以通过一些公式或条件格式突出显示满足上述要求的所有有效行 我已经附加了一个谷歌驱动器链接,在那里可以找到电子表格,我有一些图片的工作表以及。我知道使用条件格式可能是可行的,但我只是不知道如何将我希望它做的所有事情组合到一个公式中 示例如下: 第2行是一个有效条目,因为从2021年3月15日开始,第1项的值最低,与第

我有一个带有标准、开始和结束日期以及值的电子表格。目标是为每个唯一标准和开始日期找到最小值,而不重叠日期(不包括结束日期)。我制作了一个pivot表来简化自己,但我知道可能有一种方法可以通过一些公式或条件格式突出显示满足上述要求的所有有效行

我已经附加了一个谷歌驱动器链接,在那里可以找到电子表格,我有一些图片的工作表以及。我知道使用条件格式可能是可行的,但我只是不知道如何将我希望它做的所有事情组合到一个公式中

示例如下:

第2行是一个有效条目,因为从2021年3月15日开始,第1项的值最低,与第9行相同

第5行有效,因为开始日期不在第2行的日期范围内(不包括结束日期)

第7行无效,因为开始日期介于第6行的开始日期和结束日期之间


您可以向项目中添加绑定脚本。然后,您可以使用指定了功能(类似按钮)的图片/绘图调用它,也可以将菜单添加到Google工作表中

从你在问题和评论中所说的话来看,这似乎是你正在尝试的。请注意,这需要V8运行时(应为默认值)

函数验证(){
//得到正确的表格
const spreadsheet=SpreadsheetApp.getActiveSpreadsheet()
const sheet=spreadsheet.getSheetByName('Sheet1')
//获取数据
常量长度=sheet.getLastRow()-1
常量范围=sheet.getRange(2,1,长度,4)
const rows=range.getValues()
const data=Array.from(rows.entries(),([index,[item,start,end,value]])=>{
/*
*行索引
*1标准1
*2项目1 0
*3项目1
*4项目1 2
*
*行=索引+2
*/
返回{
行:索引+2,
标准:项目,
start:start.getTime(),
end:end.getTime(),
价值:价值
}
})
//按条件(asc)、开始日期(asc)、值(asc)和结束日期(asc)对数据进行排序
数据排序((a,b)=>{
让order=a.criteria.localeCompare(b.criteria)
如果(订单!==0)退货订单
顺序=a.开始-b.开始
如果(订单!==0)退货订单
顺序=a.值-b.值
如果(订单!==0)退货订单
订单=a.end-b.end
退货单
})
//迭代元素并提取有效的元素
//请注意,因为我们对它们进行了排序,所以每个条件中的第一个将始终有效
常量有效=[]
让我们来看看标准
让currentValid=[]
for(让数据行){
if(row.criteria!==currentCriteria){
//第一个标准
valid.push(…currentValid)//将valid从旧条件移动到有效列表
currentValid=[row]//有效行的新列表仅为当前列表(目前)
currentCriteria=row.criteria//设置条件
}否则{
const startDateCollision=currentValid.some(valid=>{
row.start>=valid.start&&row.start
算法故障
  • 我们得到了数据所在的表格。在本例中,我们按名称进行操作(如果不是默认的
    Sheet1
    ,请记住进行更改)
  • 我们读取数据,并将其转换为一个更为复杂的对象数组,在这种情况下,更易于管理
  • 我们对数据进行排序。这与代码中的转置类似。它还强制执行优先级顺序,并根据条件对其进行分组
  • 迭代行,仅保留有效的:
    • 我们保留了一个所有有效的(
      valid
      )列表,以及一个仅用于当前条件(
      currentValid
      )的列表,因为我们只需要检查与相同条件中的数据冲突
    • 第一次迭代将始终进入if块(因为currentCriteria未定义)
    • 更改条件时,我们将
      currentValid
      中的所有行转储到
      valid
      中。我们在循环后使用最后一个条件执行相同的操作
    • 更改条件时,
      CurrentValid
      是以当前行作为元素的数组,因为第一行始终有效(因为排序)
    • 对于其他行,我们检查开始日期是否在该条件的任何有效行的开始日期和结束日期之间。如果不是,则将其添加到此条件的有效行中
  • 我们删除validity行中所有当前的“Valid”,并用valids填充它
  • 该算法的基础实际上是对数据进行排序。它允许我们不必搜索最佳行,因为它总是下一行。它还可以确保条件的第一行始终有效

    学习资源
    代码引用

    我认为同时拥有数据透视表和数据映像是令人困惑的,因为它们似乎并不一致。如果数据透视表中的第5行有效,是否只是因为第4行没有开始日期?在数据视图中,为什么第4行有效?开始日期不在第3行的日期范围内吗?我不知道您要描述的实际算法是什么。是否希望该组的日期不重叠,且每个项目的值之和最小?或者可能是最早的开始日期优先,然后尝试适合其余的和t