次のドキュメントがあります。
+---+-----------+
| | A |
+---+-----------+
| 1 | Foo (100) |
| 2 | Bar (30) |
| 3 | Baz (50) |
+---+-----------+
REGEXEXTRACT
を使用して、列Aの各行から数値を抽出し、合計します。例えば:
=SUM(REGEXEXTRACT(A1, "\d+"), REGEXEXTRACT(A2, "\d+"), REGEXEXTRACT(A3, "\d+"))
問題は、このリストが大きくなり、行ごとに式をさらに長くする必要があることです。理想的には、次のようなすべてのアイテムでループする方法が必要です。
=SUM_LOOP(A1:A3, REGEXEXTRACT(CELL, "\d+"))
...ここで、最初の引数はループする範囲であり、CELL
はループ内の現在のセルです。
=REGEXEXTRACT(A1, "\d+")
などの数式を使用して右に列を作成し、それを下に展開し、この新しい列でSUMを実行することで簡単にこれを行うことができることを知っていますが、新しい列の作成は避けたいです可能なら。
値を持つ行配列がある場合、このカスタム関数を使用して数値の合計を計算できます(スクリプトエディターでREGEXEXTRACT
を使用することはできません。代わりにJavaScriptのRegExp
関数を使用する必要があります):
function sumLoop(v) {
var sum = 0;
for (var c = 0; c < v[0].length; c++) {
var pattern = new RegExp("\\d+", "gi");
sum += parseFloat(pattern.exec(v[0][c]));
}
return sum;
}
何らかの理由で、上記の関数で行数( Googleフォーラム で言及されているv.length
)を要求すると、エラーが返されます。
そのため、スクリプトエディタで上記の関数をコピーした後、アクションを確認するには次の操作を行います。
+---+-----------+----------+----------+-----------------+
| | A | B | C | D |
+---+-----------+----------+----------+-----------------+
| 1 | Foo (100) | Bar (30) | Baz (50) | =sumLoop(A1:C1) |
+---+-----------+----------+----------+-----------------+
配列式を使用すると、一種のループのような動作を実現できます。次の式を入力できます。
=SUM(ARRAYFORMULA(VALUE(REGEXEXTRACT(B2:B4;"\d+"))))
セル内で、必要な範囲で必要な値を計算します。