web-dev-qa-db-ja.com

値ではなくセルから数式をどのように取得しますか?

結果値の代わりにセルからリテラル値(数式)を取得するにはどうすればよいですか?

必要な例:

  • A2:「フー」
  • B3:「= A2」-「Foo」と表示されます
  • C3: "= CELL("式 "、B3)"は "= A2"を表示します

もちろん、CELL()は「式」パラメーターをサポートしていません。これは、意図を示すためだけのものです。関数リストを確認したところ、何も飛び出していません。

使用事例:
別の行への参照を作成し、その参照に基づいて行から他のセルを取得したいと考えています。行が変更されたときに自動修正されないため、明示的な行番号を指定しても機能しません(例:B3 = "2")。具体的には、ある行の複数の列を別の行の列に対して相対的にし、それらの各列を編集する必要なく、1つの場所で相対行を変更できるようにしたいと考えています。

通常、ある行を別の行に相対的にするには、「= A2 + 5」および「= B2 + 10」のような列値を配置します。つまり、A列は「相対行値+5」、B列は「相対行値+ 10」です。相対行を(たとえば、行56に)変更する場合は、各列を "= A56 + 5"および "= B56 + 10"に変更する必要があります。 1つのフィールドだけを編集してこれを行う方法は?

実際の例として、タスクのリストであるシートを考えてください。各シートは、終了日を計算するために別のタスクを「フォローしている」とマークされている可能性がありますが、参照タスクを変更してNをサポートできるようにしたいとします。タスク間の1つの関係。

[更新]

実際、私は特定のユースケースに対する解決策を持っています。しかし、私はまだ元の質問について興味があります。セルの値の背後にある数式にアクセスすることです。

解決策1:-A2: "= ROW()"-B2: "Foo"-C3: "= A2"は "2"を表示し、行が追加/削除されたときに参照を維持するように自動調整します

解決策2:

別の解決策は、一意の「ID」列を追加し、IDによって参照を格納し、LOOKUP()を使用して行を見つけることです。

15
Denis P

編集:この回答は、問題の説明のユースケース用であり、ネイティブ関数のみで実行する必要があります(スクリプトなし)

AdamLからの質問へのコメントに基づくと、答えは(値の代わりに)セルから数式を取得できないことです。

ただし、私が解決しようとしていた実際の使用例では、= ROW(A42)を使用して、行の変更で自動的に更新される特定の行への参照を取得できます。

2
Denis P

getFormula()またはgetFormulaR1C1()メソッドを使用して、セルの数式を取得します。

https://webapps.stackexchange.com/a/92156/8816 から変更された例

次のカスタム関数は、参照先のセルの数式を返しますが、参照が無効な場合は、エラーメッセージを返します。

_function CELLFORMULA(reference) {
  var ss = SpreadsheetApp;
  var sheet = ss.getActiveSheet();
  var formula = ss.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i);
  try {
    var range = sheet.getRange(args[1]);
  }
  catch(e) {
    throw new Error(args[1] + ' is not a valid range');
  }
  return range.getFormula();
}
_

上記のカスタム関数の使用例

A2:FOO
B3:数式_=A2_、値FOO
C3:式=CELLFORMULA(B3)、値_=A2_

12
Rubén

私は同じ問題を抱えており、ルベンが作成した式を使用しようとしましたが、制限がありました。これらの数式を別の数式の中で使用することはできませんでした(mid()を作成しようとしました)。したがって、機能する別のアプローチを作りました:

function CELLFORMULA(reference) {
  var ss = SpreadsheetApp;
  var sheet = ss.getActiveSheet();
  var formula = ss.getActiveRange().getFormula();
  re = /cellformula\((.*)\);/g;
  args = re.exec(formula);
  try {
    var range = sheet.getRange(args[1]);
  }
  catch(e) {
    throw new Error(args + ' is not a valid range');
  }
  return range.getFormula();
}

これを使用してください:function =FORMULATEXT("cell")

1
bob