【问题标题】:How to write a Google Script that auto updates the Filter Range for personal filters如何编写自动更新个人过滤器的过滤器范围的 Google 脚本
【发布时间】:2019-12-01 21:06:57
【问题描述】:

我有一个非常大的工作表,其中包含多个团队的多个选项卡,每个选项卡都有针对每个人的个性化过滤器,所有这些当前都定期更新,并且随着新的订单项添加到工作表中而手动更新。如何编写一个 Google 脚本来识别其中包含数据 (ANY) 的最后一行和最后一列 - 然后将范围从 A1 扩展到新的结束单元格并将此工作表上的每个过滤器范围更新为此?

我为此使用的大多数示例代码只是为新范围创建了一个新的过滤器视图并删除了以前的 - 但我希望在每个工作表上更新 5 到 20 个个人过滤器定期。 编辑我提供了我为此编写的示例代码,这不是复制的,而是使用 UpdateFilterView 请求文档中可用的内容。我不知道我是否正确设置了引用“filterSettings”的过滤器字段,并且不知道在“字段”部分中使用什么。此外,我无法判断 batchUpdate 是否设置正确。

EDIT #2 7.24.2019 - 当前代码的设置如下所示,当前收到一个无效的 JSON 有效负载错误,显示

API call to sheets.spreadsheets.batchUpdate failed with error: Invalid JSON payload received. Unknown name "fields" at 'requests[0]': Cannot find field.
Invalid value at 'requests[0].update_filter_view.filter.filter_view_id' (TYPE_INT32), "*" Invalid JSON payload received. 
Unknown name "sheet_id" at 'requests[0].update_filter_view.filter.range': Cannot find field. (line 27, file "macros")
function UpdateFilterView() {
    var sheets=SpreadsheetApp.getActiveSpreadsheet().getSheets();  
    for each (var dataSheet in sheets){ 
      var lastRow = dataSheet.getLastRow();
      var lastColumn = dataSheet.getLastColumn();
      var sheetId = dataSheet.getSheetId();
      var filterSettings = {
        "filterViewId": "*",
        "range":{
        "sheetID": sheetId,
        "startRowIndex": 0,
        "endRowIndex": lastRow,
        "startColumnIndex": 0,
        "endColumnIndex": lastColumn
        }
       }
      };


var requests = [{
  "fields": "*",
  "updateFilterView":{
  "filter": filterSettings
  }
 }];

 Sheets.Spreadsheets.batchUpdate({"requests":requests},sheetId);

 }

我希望每个个性化过滤器都会为每个工作表上的每个个性化过滤器更新 OnEdit()。

【问题讨论】:

  • 你有尝试过什么吗?你已经有代码了吗?
  • @ross 为此添加了一些示例代码,这太可怕了 - 但感谢您查看

标签: google-apps-script dynamic filter google-sheets


【解决方案1】:

您正在获取名为的特定工作表的最后一行和最后一列 dataSheet (顺便说一句,您的代码中没有定义)而不是做 它适用于每张感兴趣的表格。

相反,您需要遍历所有工作表并为每个访问其循环范围的工作表更新过滤器:

  var sheets=SpreadsheetApp.getActiveSpreadsheet().getSheets();  
  for each (var dataSheet in sheets){ 
    var lastRow = dataSheet.getLastRow();
    var lastColumn = dataSheet.getLastColumn();
    var sheetId = dataSheet.getSheetId();
    var filterSettings = {
...

另外,请记住,正确的语法是getSheetId() 而不是getSheetID(),就像filterSettings 中的关键字是"sheetId" 而不是"sheetID"。还需要在filterSettings中指定"filterViewId",在"updateFilterView"中指定"fields"(可设置为"*")。

【讨论】:

  • 非常感谢!这让我更进一步,并且非常感谢您对语法的注释 - 我只在极少数情况下使用 VBA/脚本进行编码,随机大写字母是我的一个缺点。也就是说,我已经进行了编辑,但我在“requests[0].update_filter_view.filter.range 处收到“收到无效的 JSON 有效负载”未知名称“filter_view_id”:在请求 [0] 处找不到字段未知名称“sheet_id”。 update_filter_view.filter.range':找不到字段。我的代码中的这一行是 Sheets.Spreadsheets.batchUpdate({"requests":requests},sheetId);
  • 很高兴它有帮助!如上所述,请将 JSON 请求中的“sheetID”替换为“sheetId”。 Apps 脚本错误消息并不总是易于解释 - 即使您仅在第 27 行收到错误,它也可能(并且在这种情况下)由上述请求语法引起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2013-04-19
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多