如何解决如何在 Google 表格中计算不重叠期间的总持续时间?
我在这里创建了一个具有重叠时间段的 sample sheet。我想计算没有重叠的总持续时间。我见过公式,但它不适用于较大的数据集或仅适用于 Excel。
我在 Stack Overflow 中也找到了一个示例公式,但它不适用于更大的数据集或更长的持续时间。
=SUMPRODUCT((COUNTIFS(D2:D23,""&MIN(D2:D23)+ ROW(INDIRECT("1:"&ROUND((MAX(E2:E23)-MIN(D2:D23))*1440,0)))/1440-1/2880,C2:C23,I2,B2:B23,I1 )>0)+0)/60
解决方法
首先,要计算时差,假设您是手动计算的,您可以使用以下公式:
=(hour(D2)+ MINUTE(D2)/60)- (hour(C2)+ MINUTE(C2)/60)
要查找 overlapping time
,您可以使用 if
函数来这样做:
=IF(and(D4<E3,B4=B3),((HOUR(E3)+MINUTE(E3)/60) - (HOUR(D4)+MINUTE(D4)/60)),0)
在您的示例中,减去 5.5 hrs
后没有重叠的总时间应为 total time w overlapping minus total overlapping time
。我说的对吗?
=SUM(E:E)-SUM(F:F)
,
像这样的脚本将使用“gap and island”原则给出任务的净时间(不幸的是,所有引用似乎都与 SQL 相关)。另请参阅 VBA version of this,以下内容改编自:
function myFunction(prange) {
var p = sheet.getRange(prange);
var array = p.getValues();
// Sort on start time
array.sort(function(a,b) {
return a[0] - b[0];
})
// Initialise
minStart = array[0][0];
maxEnd = array[0][0];
gap = 0
// Loop over rows
for (i = 0; i<array.length;i++)
{
// If there is a gap,increment total gap length
if (array[i][0] > maxEnd )
gap = gap + array[i][0].valueOf() - maxEnd;
// Update latest end time
if (array[i][1] > maxEnd)
maxEnd = array[i][1];
}
TimeOnTask = (maxEnd - minStart - gap)/(60*60*1000);
return TimeOnTask;
}
这是能够传递数组(因此可以使用过滤器)并检查添加的非日期的整个脚本:
function myFunction(param) {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var r,array;
if(typeof param =="string")
{
r = sheet.getRange(param);
array = r.getValues();
}
else
array=param;
//Check for non-dates
filteredArray = array.filter(function(value) {
return Object.prototype.toString.call(value[0]) == "[object Date]" && Object.prototype.toString.call(value[1]) == "[object Date]";
});
// Sort the array
filteredArray.sort(function(a,b) {
return a[0] - b[0];
})
// Initialise
minStart = filteredArray[0][0];
maxEnd = filteredArray[0][0];
gap = 0
// Loop over rows
for (i = 0; i<filteredArray.length;i++)
{
// If there is a gap,increment total gap length
if (filteredArray[i][0] > maxEnd )
gap = gap + filteredArray[i][0].valueOf() - maxEnd;
// Update latest end time
if (filteredArray[i][1] > maxEnd)
maxEnd = filteredArray[i][1];
}
TimeOnTask = (maxEnd - minStart - gap)/(60*60*1000);
return TimeOnTask;
}
因此您可以像这样将过滤后的数据传递给它:
=myfunction(filter(D2:E,B2:B=J1,C2:C=J2))
给这个:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。