【问题标题】:Spreadsheet formula taking too long to run - script advise电子表格公式运行时间过长 - 脚本建议
【发布时间】:2013-09-08 14:31:37
【问题描述】:

以下公式需要很长时间才能运行。

= 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

【问题讨论】:

  • 那不是应用程序脚本。它的电子表格公式。放置正确的标签。
  • 我正在尝试了解如何将电子表格公式转换为自定义谷歌脚本。
  • 提供更多关于它的作用的解释。如果您使用相同的算法对其进行编码,则脚本将比公式慢。您可能需要改变策略。
  • 它检查 C50 中的名字、B50 中的姓氏和 F50 中的雇主是否与工作表“学生”中列出的姓名匹配。如果匹配列表,如果不是 = 不匹配。
  • 你仍然没有解释你有多少行等等。你不能通过编写一个同样的脚本来让它更快。调查为什么它现在变慢了。

标签: google-apps-script google-sheets


【解决方案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
}

【讨论】:

  • 谢谢!让我处理它。添加菜单项是一个非常好的主意。
猜你喜欢
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多