0

Google スプレッドシートでカスタム関数を構築しようとしていますが、これは基本的にこれを行います: - func() というカスタム関数がセル D2 に配置され、=func(B2) として呼び出されるとします - 特定のセル参照 (B2 など) を開始点として、列の B2 に続くすべてのフィールド (つまり、B3、B4、B5) を反復処理しますが、これらのフィールドの値は特定の記号 (パイプ | など) に等しくなります。- この条件が成功する (つまり、B3 == '|') 反復ごとに、配置されたセルの値を列の下に追加/集計できます。したがって、セル B3、B4、B5 に | が含まれているとします。B6 は D3+D4+D5 の値を返しません。

たとえば、このスプレッドシートの場合:

ここに画像の説明を入力

セル B10 では、関数は値 8 (1+3+4) を生成し、セル B15 では関数は値 11 (5+6) を生成する必要があります。

私はこのようなものを思いついた:

function sumByPipe(startRange) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(startRange)
  var sum = 0;
  for (var row_num = 1; row_num < 128;  row_num ++) {

    var cell = range.getCell(row_num, 1);
    var cellValue = cell.getValue();

    if (cellValue == '|') {
      sum += 1;
    }

  }
  return sum;
}

本当に2か所で立ち往生しました:

  1. 関数はデバッガーで動作しているように見えますが、スプレッドシートから呼び出すと、そのような範囲が存在しないと言って getRange() 関数呼び出しで失敗します。getRange('A2') などの静的呼び出しに置き換えると、その部分は機能しますが、getCell() で index out of range と言って失敗します。

  2. 関数自体が配置されている場所から列の次のセルの値を実際に取得するにはどうすればよいですか?

これら2つについて本当にかなり迷っており、アドバイスをいただければ幸いです。ありがとうございました!

4

1 に答える 1

2

これは機能します。私はそれをテストしました:

function sumByPipe(startRange) {

  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(startRange)
  var sum = 0;

  var startColumn = range.getColumn();
  var startRow = range.getRow();

  for (var row_num = startRow; row_num < startRow+128;  row_num++) {

    var cellWithPipe = sheet.getRange(row_num, startColumn-1).getValue();
    var cellValue = sheet.getRange(row_num, startColumn).getValue();

    if (cellWithPipe === '|') {
      sum += cellValue;
    } else {
      //If pipe is no longer present, stop and return sum
      return sum;
    }
  }
}
于 2015-07-04T00:45:12.120 に答える