后续行取决于前一行的不同列您好 - 我正在进行一组实验,其中一些实验依赖于以前的实验(即我正在混合以前制作的解决方案来制作新的实验)。 我正在尝试创建一个函数,它读取一列以获取上一个解决方案的名称,搜索第二列以查找具有该名称的行,然后获取具有该行和第三列的单元格中的值。 匹配似乎有点这样做,但我无法让它工作,我认为部分原因是匹配需要明确指定的搜索列级别,也许还有其他我没有意识到的东西。 我在 JSL 方面完全没有经验,并且更喜欢像匹配列函数这样的东西,但如果 JSL 就是这样的,那么那就完全没问题了。
我附上了一个虚拟表格,应该可以在不看到所有无关的其他列的情况下表达要点。 最后一列是公式失败的一列,这是一个屏幕截图

以及不起作用的代码(如果更容易处理的话):
Match( :溶液名称, :用于稀释的溶液, :给定浓度 ) /
:稀释系数
提前致谢。
自动化和脚本编写视窗回复:后续行依赖于前一行的不同列一种选择是使用类似的方法来获取索引
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
row_idx[1]
);
那么你可以使用数据表下标访问行特定行上的值。 所以最终的公式是这样的
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
:Given Concentration[row_idx[1]] / :Dilution Factor
);
回复:后续行依赖于前一行的不同列这是我想出的公式。它也许可以被简化,但以目前的形式来看,它似乎可以工作。
x = .;
If( :Used solution for dilution[Row()] != "",
curRow = Row();
targetRow = (Current Data Table() << get rows where(
:Letters == :Used solution for dilution[curRow]
))[1];
x = :Given Concentration[targetRow] / :Dilution Factor[curRow];
);
x;
回复:后续行依赖于前一行的不同列嘿@jthi - 这成功了! 只是为了让我理解其中的逻辑,因为这是我第一次接触 JSL,我不想完全推断发生了什么:
1. :Column1 << Get Values 创建一个内容和顺序与 :Column1 相同的临时列表。
2. Loc(:Column2 << Get Values, :Column2) 然后给出所有行号的有序列表,其中 :Column1 与 :Column2 中每行的内容相匹配。 我们将其分配给 row_idx。
在 if 语句中,
3. N Items( row_idx ) < 1 表示如果列表为空(即没有匹配项),我们通过放置“.”将其设为空白。在,
4. 如果 row_idx 列表中有大于或等于 1 个条目,则 :Column3[row_idx[1]] 是索引的索引,其中我们取出 row_idx 列表中的第一个条目,将该条目用作第 n 个条目的:第3栏。
这是它的要点吗?
感谢您为此所做的工作!
回复:后续行依赖于前一行的不同列@tx尼尔森感谢您的代码;你的也成功了! 我没有任何使用 JSL 的经验,只使用过 VBA 和 Matlab,所以就像@jthi ,我想了解一下。 所以为了确保我理解
1.x=.只是定义了一个空变量x。
2. 如果在与正在评估的同一行中存在来自:用于稀释的溶液的单元格不为空白 =>
3. curRow = Row() 定义 curRow 为当前行号
4. 获取行 where(
:溶液名称== :用于稀释的溶液[curRow]
))[1]
通过使用该值作为索引来获取 :Used Solutions 的值以稀释当前行,并且“get[s] row[numbers] where”这些值与 :Solution 中的值相同。
5. targetRow = (Current Data Table() << get rows where(... 然后根据步骤 3 中确定的行创建一个矩阵,下标 1 获取此矩阵中的第一个条目, 。
6. 最后,通过将我们在 4 中指定的给定浓度行除以当前行中在 3 中指定的稀释因子来填充 x。
7. 我们将“x”返回到单元格。
我的一个问题来自步骤 5,我认为 targetRow 是我们想要的行中每个条目的列表,但为了让步骤 6 工作,它必须返回实际的行号。 我认为我误解了 Current Data Table () << get rows where(... 的工作原理。 你能详细说明一下吗?
再次感谢您抽出时间!
回复:后续行依赖于前一行的不同列<< Get RowsWhere() 返回与传递给函数的选择条件相匹配的行矩阵。
因此,当发现某一行“稀释用溶液”列的值不为空/缺失时,
- 内存变量 curRow 设置为正在处理的当前行 Row()。在本例中,curRow 将设置为 6。
- targetRow,需要设置为包含“给定浓度”的行,该行来自“字母”列中具有匹配值的行,以及“稀释用溶液”的当前行值。
- 解析时,Get RowsWhere 是:
<< get rows where(:Letters == :"C"])
该函数允许返回多行,因此,它返回与选择条件匹配的所有行号的矩阵。在我们的例子中,将返回单个元素矩阵,我们想要第一个元素的值,即 3,即该行的行号,其中列字母等于“C”
回复:后续行依赖于前一行的不同列<< 获取值用于将列中的值获取到列表或矩阵中(取决于数据类型)。
洛克()可用于从矩阵/列表中获取与我们提供的项目相匹配的索引,或者返回非缺失值的索引(我认为非常好的函数)。
Loc 将返回一个矩阵,因此我们使用 N Items() 来检查是否找到任何索引,以避免访问索引时出现问题。 如果没有找到索引,我们将这些行的值设置为缺少“.”。
根据提供的数据,我选择始终使用索引中的第一个索引。 如果在多个匹配的情况下需要更复杂的计算,则可以使用所有这些。
下面是公式创建和一些注释
Names Default To Here(1);
dt = New Table("Calculated concentration - Dummy table",
Add Rows(6),
Compress File When Saved(1),
New Column("Given Concentration", Numeric, "Continuous", Format("Best", 12), Set Property("Units", "ppm"), Set Values([12, 50, 23, 14, 2, .])),
New Column("Letters", Character(1), "Nominal", Set Values({"A", "B", "C", "D", "E", "F"}), Set Display Width(38)),
New Column("Used solution for dilution", Character, "Nominal", Set Values({"", "", "", "", "", "C"})),
New Column("Dilution Factor", Numeric, "Continuous", Format("Best", 12), Set Values([., ., ., ., ., 2.29837984]))
);
dt << New Column("Calculated Concentration (ppm)", Numeric, Continuous, Formula(
// use As Constant to evaluate this only once (should make it more efficient if you have lots of data)
As Constant(all_letters = :Letters << get values); // << get values gets values from column into a matrix or list
idx_for_letter = Loc(all_letters, :Used solution for dilution); // Loc can be used to return indices of matches in matrix but it has many other uses
If(N Items(idx_for_letter) == 0, // to avoid issues when trying to access incorrect indices, check for empty matrix
. // set missing value to column IF no indices found
,
:Given Concentration[idx_for_letter[1]] / :Dilution Factor // perform calculation using first index found from idx_for_letter
);
));
要获得有关所用函数的解释,我建议首先使用脚本索引来搜索该函数,然后单击“主题帮助”进入帮助页面。 例如搜索“as Constant”

然后单击主题帮助打开此页面作为常数(expr)