谷歌脚本FIlter问题

时间:2012-12-04 13:39:27

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

我正在使用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)');

1 个答案:

答案 0 :(得分:1)

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

您的选项2:没有必要以编程方式插入CONTINUE,因为当过滤器范围中的行与表达的条件匹配时,FILTER所需的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")