【问题标题】:Google script FIlter issue谷歌脚本过滤器问题
【发布时间】:2012-12-04 13:39:27
【问题描述】:

我正在使用 google 脚本、表单和电子表格对帮助台系统进行编程。 为了过滤查询,根据类别将提交的内容放入不同的工作表中,这是通过 FILTER 函数完成的。但是每次新提交时,过滤器功能都不会更新,(它使用 CONTINUE 功能覆盖其他单元格) 而是必须选择具有 FILTER 功能的单元格,并且必须输入 crtl+shift+E

有没有办法解决这个问题? 我试过两种方法 第一个是希望有一个输入快捷方式的功能,但这可能吗?

第二个是每次新提交时自动进入继续功能,我有这个工作但是谷歌表格无法识别命名范围,(继续功能设置 CONTINUE(原始单元格,行距,列距) 它是它无法识别的原始单元格,相反我必须手动选择该单元格并重新编写完全相同的单元格引用。

感谢您的帮助,如果您需要查看我的代码,请询问:)

这是我尝试手动将函数输入到单元格的第二个选项的代码。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var numEntry = ss.getSheetByName('Home').getRange("B8").getValue() + 2;
var cat = ss.getSheetByName('Software problem').getRange(numEntry, 4, 1, 9);
cat.getCell(1, 1).setValue('=CONTINUE(D2, '+(numEntry-1)+', 1)');

【问题讨论】:

  • 是的,如果您需要代码帮助,请分享一些代码
  • 我已经为我通过使用脚本自动输入继续功能探索的第二个选项输入了代码,我希望这会有所帮助

标签: google-apps-script google-sheets google-apps google-spreadsheet-api


【解决方案1】:

您的选项 1:让脚本自动输入击键?应用脚本不支持。

您的选项 2:不必以编程方式插入 CONTINUE,因为当过滤器范围内的行与表达的条件匹配时,过滤器所需的 CONTINUE 应该是自动的。还有其他问题,所以不要被这个红鲱鱼赶上。

您提到“谷歌表格无法识别命名范围”-我想知道您的意思,因为我怀疑这就是您的解决方案。您可以在 FILTER 语句中使用命名范围。您还可以使用开放式范围,例如 FormInput!A1:XFormInput!E1:E.

如果您尝试使用脚本操作命名范围,那么您可能遇到了一个已知问题“removeNamedRange() only removes named ranges that were created via Apps Script”。 (要解决这个问题,请手动删除命名范围,然后仅从脚本创建它。)

这是我用来为工作表上的所有数据创建命名范围的函数。您可以根据自己的情况进行调整。 (我将它与 QUERY 函数而不是 FILTER 一起使用,您可能需要考虑将其作为替代方案。)

function setNamedRangeFromSheet(sheetName) {
  // Cannot remove a named range that was added via UI - http://code.google.com/p/google-apps-script-issues/issues/detail?id=1041
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  try { ss.removeNamedRange(sheetName) } catch (error) {};
  var sheet = ss.getSheetByName(sheetName);
  var range = sheet.getDataRange();
  ss.setNamedRange(sheetName,range);
}

使用 FILTER,您需要匹配 sourceArray(可以是命名范围)的长度和您使用的任何标准数组。要以编程方式为 sourceArray 中的单列条件创建一个命名范围,并且长度相同,请在 sourceArray 范围上使用 getNumRows()。

现在,在表单提交时触发的提交处理函数中,您将拥有类似的内容。 (我假设您的故障报告会出现在一张表格中,“FormInput” - 根据需要进行调整。)

...
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  try { ss.removeNamedRange("FormInput") } catch (error) {};
  var sheet = ss.getSheetByName("FormInput");
  var inputRange = sheet.getDataRange();
  ss.setNamedRange("FormInput",inputRange);

  try { ss.removeNamedRange("Criteria") } catch (error) {};
  var criteriaCol = 4; // Another guess, that Column E contains our criteria
  var criteriaRange = sheet.getRange(0,criteriaCol,inputRange.getNumRows(),1);
  ss.setNamedRange("Criteria",criteriaRange);
...

有了这些,“软件问题”表上 A1 的内容只需要包含以下内容。 (假设您正在寻找“Bug”。):

=FILTER(FormInput,Criteria="Bug")

我之前提到了开放式范围。如果您没有对数据进行足够的操作来证明命名范围的合理性,您可以像这样设置您的过滤器,而不必在新输入进入时更改它:

=FILTER(FormInput!A1:X,FormInput!E1:E="Bug")

【讨论】:

  • 我意识到使用选项 2,它们应该自动出现但它们没有,它在过滤器单元格中说某些值不显示,按 ctrl+shift+e 刷新
  • 无法识别的命名范围是当我使用脚本进入 continue 函数时,因为括号中的第一个元素是过滤函数所在的单元格引用,它是这个单元格引用,在我的情况下“d2”无法识别,相反我必须手动进入并删除并租用这两个以使其工作,我没有将其识别为单元格引用。如果我将 d2 设为永久命名范围,这可能会解决它吗?我也会尝试您的解决方案并回复您,谢谢
  • 我过去也看到过同样的“未显示”警告,我认为这是因为我的电子表格需要很长时间才能重新计算,因为它达到了 Google 的大小或复杂性限制。它通常发生在我一直在“摆弄”查询时,导致许多重新计算,所以如果你看到当你一直在积极编辑你的工作表时,这可能是你被合理使用“限制”了政策。 (见Google spreadsheets size and complexity limits。)
  • 好的,谢谢,有没有办法在工作表中手动绕过它,或者我只需要处理它,因为我确实有依赖这些的脚本元素
  • 使用手动命名范围我能够解决问题,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 2016-10-08
相关资源
最近更新 更多