这些天我发了一篇文章,展示了如何为 Google 表格创建两个自定义公式,以根据条件添加小时数(此处)。我认为他们的问题是不灵活。如果我想要 N 个条件怎么办?好吧,现在你可以了!
现在该公式需要 3 组数据:持续时间、条件和过滤指令。 让我们回到测试电子表格:
Título | Duração | Categoria | Status | Curti |
---|---|---|---|---|
Perdido em Marte | 01:00:00 | Filme | Já assisti | Sim |
Interestelar | 02:49:00 | Filme | Já assisti | Não |
John Wick | 01:30:00 | Filme | Já assisti | Não |
Vingadores: Ultimato | 03:00:00 | Filme | Quero assistir | |
Stranger Things | 00:45:00 | Série | Assistindo | |
The Witcher | 01:00:01 | Série | Assistindo | |
O Mandaloriano | 00:40:00 | Série | Assistindo | |
Breaking Bad | 00:50:00 | Série | Já assisti | Sim |
A Casa de Papel | 00:55:00 | Série | Quero assistir | |
Game of Thrones | 01:10:00 | Série | Quero assistir |
让我们更新我们的应用程序脚本,我建议创建另一个测试电子表格并开始一个新的电子表格,记住时间必须是“纯文本”。代码在这里:
/** * Converte uma string no formato HH:MM:SS para o total em segundos. * * @param {string} hms - A string no formato HH:MM:SS. * @returns {number} O total em segundos. */ function converterHMSParaSegundos(hms) { const partes = String(hms).split(":"); const [horas, minutos, segundos] = partes; return Number(horas) * 3600 + Number(minutos) * 60 + Number(segundos); } /** * Converte um número de segundos para o formato HH:MM:SS. * * @param {number} segundos - O total de segundos. * @returns {string} O tempo no formato HH:MM:SS. */ function converterSegundosParaHMS(segundos) { const horas = Math.floor(segundos / 3600); const minutos = Math.floor((segundos % 3600) / 60); const segundosRestantes = segundos % 60; return `${String(horas).padStart(2, "0")}:${String(minutos).padStart( 2, "0" )}:${String(segundosRestantes).padStart(2, "0")}`; } /** * Filtra as linhas da matriz de dados com base nos critérios fornecidos e retorna as durações correspondentes. * * @param {Array<string>} duracoes - Array de durações em formato de texto. * @param {Array<Array<string>>} dados - Matriz de dados onde cada linha corresponde a um conjunto de valores. * @param {Array<string>} criterios - Array de critérios para filtrar as linhas da matriz de dados. * @returns {Array<string>} Retorna as durações que correspondem aos critérios. */ function filtroDeLinhas(duracoes, dados, criterios) { const linhas_na_matriz = duracoes.length; const matriz_de_criterios_concatenada = []; for (let linha = 0; linha < linhas_na_matriz; linha++) { let incluirLinha = true; for (let coluna = 0; coluna < dados[linha].length; coluna++) { if (!criterios.includes(dados[linha][coluna])) { incluirLinha = false; break; // Sai do loop se algum critério não for atendido } } if (incluirLinha) { matriz_de_criterios_concatenada.push(duracoes[linha]); } } return matriz_de_criterios_concatenada; } /** * Soma as horas filtradas de acordo com os critérios fornecidos. * * @param {Array<string>} duracoes - Array de durações em formato de texto. * @param {Array<Array<string>>} intervalo_de_criterios - Matriz de dados onde cada linha corresponde a um conjunto de valores. * @param {...string} criterios - Um ou mais critérios para filtrar as linhas da matriz de dados. * @returns {string} A soma das durações no formato HH:MM:SS. */ function somarHorasComCriterios( duracoes, intervalo_de_criterios, ...criterios ) { // Verifica se todos os argumentos são arrays if ( !Array.isArray(duracoes) || !Array.isArray(intervalo_de_criterios) || !Array.isArray(criterios) ) { return "Passe os intervalos para o cálculo!"; } const horasParaSomar = filtroDeLinhas( duracoes, intervalo_de_criterios, criterios.flat(Infinity) ); const horasEmSegundos = horasParaSomar.map((n) => converterHMSParaSegundos(n) ); const somaDosSegundos = horasEmSegundos.reduce( (acumulador, valorAtual) => acumulador + valorAtual, 0 ); return converterSegundosParaHMS(somaDosSegundos); }
假设我通过了:
电影|我已经看过了 |没有
我的总和是:04:19:00
请记住,我可以使用本机函数将其包装:=VALUE 并将其格式化为“持续时间”,工作表将再次计算总和,就像使用本机公式一样!
正如我在上一篇文章中所说,请留下您的评论、建议或问题。拥抱。
以上是Google 表格:持续时间(小时)的 SUMIFS,第 2 部分的详细内容。更多信息请关注PHP中文网其他相关文章!