- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设您在 Google 表格中有这样一个电子表格
你想对 Q:Q 中单元格的所有值求和 WHERE CORRESPONDING 单元格(即 在同一行)在列 D:D 中具有某些给定值..
现在,如果我们使用像 MySql 这样的数据库语言,我想这会很容易,您可能会指示类似的东西
SELECT cells in "Tot. / Anno" (Q:Q) WHERE "level" (D:D) is B or MID
就是这样,但我想在 Javascript 中不可能有这么直接的事情;所以恐怕需要一些解决方法。
那么,首先,表格背后的逻辑是什么?
在 level 下的 D:D 列中,您有四个选项可供选择,它们是:b、mid、pro 和顶部。 B代表basic,这里的逻辑是试图建立一个gradual budget。
有些费用是基本的,你无法避免,比如医疗、银行账户或电话;休闲、旅游等是次要的,可以省下。所以它们不是基本的,但很可能是 mid pro 甚至 top :)这就是背后的逻辑和值(value)尺度。
当您在 D2 中选择给定条件时,您应该根据相同的渐进逻辑在 G2 中获得匹配的 SUM:
b in D2 --> only sum cells in Q:Q where value is b
mid in D2 --> only sum cells in Q:Q where value is b OR mid
pro in D2 --> only sum cells in Q:Q where value is b OR mid OR pro
top in D2 --> sum cells in Q:Q where value is b OR mid OR pro OR top
现在,关于编码,这是我找到的解决方法。 确实有效,但不够优雅。
我想听听一些更有效和正确的方法来处理这件事:我是初级水平,我相信有更有效的解决方案可用
// onEdit is meant to make sure that a real-time recalculation is triggered
// at any change within the specified columns
function onEdit(e){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var cell = sheet.getRange("Q2");
var range = e.range;
var columnOfCellEdited = range.getColumn();
if (columnOfCellEdited === 4 || 17) {
// creating 2 different arrays from the two different comlumns (ranges)
var range1 = sheet.getRange("D3:D100").getValues();
var range2 = sheet.getRange("Q3:Q100").getValues();
// merging the two single arrays into one 2d array (you can't have one single
// 2d array from the start because the two columns are not adjacent I guess)
var range=[],i=-1;
while ( range1[++i] ) {
range.push( [ range1[i][0], range2[i][0] ] );
}
// I tried to come up with a global SUM but I don't know why it does not work
// var valore_glob = range2.reduce(function(acc, val) { return acc + val; }, 0);
// as much filters as given values in the validation drop-down list: each
// filter returns only the correspoding values
// FILTRO BASE - keeps only B values
var filt_bas = range.filter(function (dataRow) { return dataRow[0] === 'b';});
// splitting the 2d array into two singles arrays, we keep only the second
// one for the follwing SUM
var yArray_bas = filt_bas.map(function(tuple) { return tuple[1];});
// summing up all the values within the resulting array
var valore_bas = yArray_bas.reduce(function(acc, val) { return acc + val; }, 0);
// FILTRO MID - keeps only MID values
var filt_mid = range.filter(function (dataRow) { return dataRow[0] === 'mid';});
// splitting the 2d array into two singles arrays, we keep only the second
// one for the follwing SUM
var yArray_mid = filt_mid.map(function(tuple) { return tuple[1];});
// summing up all the values within the resulting array
var valore_mid = yArray_mid.reduce(function(acc, val) { return acc + val; }, 0);
// FILTRO PRO - keeps only PRO values
var filt_pro = range.filter(function (dataRow) { return dataRow[0] === 'pro';});
// splitting the 2d array into two singles arrays, we keep only the second
// one for the follwing SUM
var yArray_pro = filt_pro.map(function(tuple) { return tuple[1];});
// summing up all the values within the resulting array
var valore_pro = yArray_pro.reduce(function(acc, val) { return acc + val; }, 0);
// FILTRO TOP - keeps only TOP values
var filt_top = range.filter(function (dataRow) { return dataRow[0] === 'top';});
// splitting the 2d array into two singles arrays, we keep only the second
// one for the follwing SUM
var yArray_top = filt_top.map(function(tuple) { return tuple[1];});
// summing up all the values within the resulting array
var valore_top = yArray_top.reduce(function(acc, val) { return acc + val; }, 0);
var selector = sheet.getRange("D2").getValue();
switch (selector) {
default:
cell.setValue(valore_bas);
break;
case 'mid':
cell.setValue(valore_bas + valore_mid);
break;
case 'pro':
cell.setValue(valore_bas + valore_mid + valore_pro);
break;
case 'top':
cell.setValue(valore_bas + valore_mid + valore_pro + valore_top);
}
}
}
欢迎提出建议,谢谢。
学分:
Writing google Javascript similar to vlookup
Sum elements of an array with specific attribute
Spreadsheet Non-Adjacent Column data
How to find the sum of an array of numbers
How to filter an array of arrays?
Split a 2D array into single arrays
code.gs 中的最新工作实际代码: https://jsfiddle.net/John_Galassi/5ahrLmg9/
最佳答案
可以尝试使用内置函数
=iferror(sumproduct(regexmatch(D3:D, "^("&vlookup(D2, {"b", "b"; "mid", "b|mid"; "pro", "b|mid|pro"; "top", "b|mid|pro|top"}, 2, 0)&")$"), Q3:Q))
或者,根据您的语言环境
=iferror(sumproduct(regexmatch(D3:D; "^("&vlookup(D2; {"b"\ "b"; "mid"\ "b|mid"; "pro"\"b|mid|pro"; "top"\ "b|mid|pro|top"}; 2; 0)&")$"); Q3:Q))
或者,您可以在谷歌脚本中创建自定义函数:
function sumOnCondition(filter, checkrange, sumrange) {
var arr, ind;
arr = ["b", "mid", "pro", "top"];
ind = arr.indexOf(filter);
arr = (filter === "top") ? arr : arr.slice(0, ind + 1);
return checkrange.map(function(r, i) {
return arr.indexOf(r[0]) > -1 ? Number(sumrange[i]) : 0;
}).reduce(function(a, b) {
return a + b;
})
}
然后在电子表格中输入 G2
=sumOnCondition(D2, D3:D, Q3:Q)
或者,根据您的语言环境
=sumOnCondition(D2; D3:D; Q3:Q)
看看有没有帮助?
关于javascript - 在给出相应单元格值的列中选择单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57969934/
我正在 csv 上使用 hadoop 来分析一些数据。我使用sql/mysql(不确定)来分析数据,现在陷入了僵局。 我花了好几个小时在谷歌上搜索,却没有找到任何相关的东西。我需要一个查询,在该查询中
我正在为 Bootstrap 网格布局的“简单”任务而苦苦挣扎。我希望在大视口(viewport)上有 4 列,然后在中型设备上有 2 列,最后在较小的设备上只有 1 列。 当我测试我的代码片段时,似
对于这个令人困惑的标题,我深表歉意,我想不出这个问题的正确措辞。相反,我只会给你背景信息和目标: 这是在一个表中,一个人可能有也可能没有多行数据,这些行可能包含相同的 activity_id 值,也可
具有 3 列的数据库表 - A int , B int , C int 我的问题是: 如何使用 Sequelize 结果找到 A > B + C const countTasks = await Ta
我在通过以下功能编写此查询时遇到问题: 首先按第 2 列 DESC 排序,然后从“不同的第 1 列”中选择 只有 Column1 是 DISTINCT 此查询没有帮助,因为它首先从第 1 列中进行选择
使用 Bootstrap 非常有趣和有帮助,目前我在创建以下需求时遇到问题。 “使用 bootstrap 在桌面上有 4 列,在平板电脑上有 2 列,在移动设备上有 1 列”谁能告诉我正确的结构 最佳
我是 R 新手,正在问一个非常基本的问题。当然,我在尝试从所提供的示例中获取指导的同时做了功课here和 here ,但无法在我的案例中实现这个想法,即可能是由于我的问题中的比较维度更大。 我的实
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个 df , delta1 delta2 0 -1 2 0 -1 0 0 0 我想知道如何分配 delt
您好,我想知道是否可以执行以下操作。显然,我已经尝试在 phpMyAdmin 中运行它,但出现错误。也许还有另一种方式来编写此查询。 SELECT * FROM eat_eat_restaurants
我有 2 个列表(标题和数据值)。我想要将数据值列 1 匹配并替换为头文件列 1,以获得与 dataValue 列 1 和标题值列 2 匹配的值 头文件 TotalLoad,M0001001 Hois
我有两个不同长度的文件,file2 是一个很大的引用文件,我从中提取文件 1 的数据。 我有一行 awk,我通常会对其进行调整以在我的文件中进行查找和替换,但它总是在同一列中进行查找和替换。 所以对于
假设我有两个表,如下所示。 create table contract( c_ID number(1) primary key, c_name varchar2(50) not
我有一个带有 varchar 列的 H2 表,其检查约束定义如下: CONSTRAINT my_constraint CHECK (varchar_field <> '') 以下插入语句失败,但当我删
这是最少量的代码,可以清楚地说明我的问题: One Two Three 前 2 个 div 应该是 2 个左列。第三个应该占据页面的其余部分。最后,我将添加选项来隐藏和
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我有一个包含 28 列的数据库。第一列是代码,第二列是名称,其余是值。 public void displayData() { con.Open(); MySqlDataAdapter
我很沮丧:每当我缩小这个网页时,一切都变得一团糟。我如何将网页居中,以便我可以缩小并且元素不会被错误定位。 (它应该是 2 列,但所有内容都合并为 1)我试过 但由于某种原因,这不起作用。 www.o
我是一名优秀的程序员,十分优秀!