0

次の数式は、実行に非常に時間がかかります。

= TRANSPOSE (
    IFERROR (
      INDEX (
        FILTER(Students!B:B;
         REGEXMATCH(Students!B:B; C50), 
         REGEXMATCH(Students!B:B; B50),  
         REGEXMATCH(Students!C:C; F50)
       ));"NO MATCH"
  ))

私はプログラミングをほとんど知らないので、コーディングに関する提案は素晴らしいでしょう。

ありがとうT

4

1 に答える 1

1

これは、使用している数式を置き換えることができるカスタム関数です。例えば:

=listStudents(C50,B50,F50)

そのように使用すると、一定の再計算が行われますが、正規表現テストよりもはるかに高速になるはずです。または、同じ関数をメニュー項目から呼び出して、シート内の特定のターゲット範囲を設定するために使用することもできます。これにより、自動再計算が完全に回避されます。

コード:

/**
 * Custom spreadsheet function to produce a list of names of
 * students that match the given criteria.
 */
function listStudents( givenName, surname, employer ) {
  var matches = [];  // matching students will be placed in this array
  var HEADERS = 1;   // # rows of header info at top of sheet
  var FULLNAME = 1;  // Column containing full names (B)
  var EMPLOYER = 2;  //                   employers (C)

  // Array filter function - returns true if conditions match
  function test4match( row ) {
    return ( row[FULLNAME].indexOf(givenName) !== -1 &&
             row[FULLNAME].indexOf(surname) !== -1 &&
             row[EMPLOYER].indexOf(employer) !== -1)
  }

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Students');
  var range = sheet.getDataRange();
  var data = range.getValues().slice(HEADERS);  // All data from sheet, without headers

  var filteredData = data.filter(test4match);   // Get matching rows
  for (var i=0; i<filteredData.length; i++) {
    matches.push(filteredData[i][FULLNAME]);    // Then produce list of names
  }

  return [matches];  // Return a 2-d array, one row
}
于 2013-09-17T04:09:22.973 に答える