後續行取決於前一行的不同列您好 - 我正在進行一組實驗,其中一些實驗依賴於以前的實驗(即我正在混合以前製作的解決方案來製作新的實驗)。 我正在嘗試創建一個函數,它讀取一列以獲取上一個解決方案的名稱,搜索第二列以查找具有該名稱的行,然後獲取具有該行和第三列的單元格中的值。 匹配似乎有點這樣做,但我無法讓它工作,我認為部分原因是匹配需要明確指定的搜索列級別,也許還有其他我沒有意識到的東西。 我在 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)