【问题标题】:How to integrate a loop into my code that will apply my request to every filterViewId?如何将循环集成到我的代码中,将我的请求应用于每个 filterViewId?
【发布时间】:2019-07-25 15:52:44
【问题描述】:

目前我的代码执行后遇到两个问题:

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), "*" (line 27, file "macros")

第一个问题是我的请求无法识别“字段”——我不知道为什么会这样。

第二个问题,也是发布此问题的主要原因是 filterViewId 正在寻找一个整数,而我所引用的只是“*”作为更新工作表中所有过滤器视图的方法。如何将循环集成到我的代码中,以便它获取第一个 filterViewId 并应用请求,然后继续下一个?

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);

 }

【问题讨论】:

  • 我可以问你关于你的问题吗? 1. 在您的脚本中,for 循环似乎不起作用。您要使用最后一个索引的工作表的值吗? 2、关于How can I integrate a loop into my code so that it Gets the first filterViewId and applies the request and then moves on to the next?the first filterViewId是什么意思?
  • @Tanaike - 1. 是的,我想在每个过滤器视图上同时使用第一行/列索引和最后一行/列索引作为过滤范围,例如,Filtered范围为 A1:AS1453,起始行/列索引应为 0,结束行/结束列应为 lastRow/lastColumn。 2. 这可能很难描述,但 filterViewID 是一个整数,分配给谷歌电子表格的特定工作表上的每个过滤器视图。当您在工作表上选择 filterView 时,此参数将在末尾的 url 中传递,如下所示 '&fvid=##########'
  • 感谢您的回复。您希望将 filterView 的一个条件反映到所有 filterView。我可以这样理解。并且可以检索所有 filterView ID。由此,您想从一个 filterView 中检索条件,并希望使用检索到的 filterView 条件更新所有其他 filterView。我的理解正确吗?我为我糟糕的英语水平道歉。

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


【解决方案1】:
  1. 您的请求无法识别fields,因为fields 需要进入"updateFilterView":{...} 内部,正如您在documentation 中看到的那样。
  2. 如果您的过滤器 ID 随着工作表编号的增加而增加(例如,"filterViewId": 1 用于第一张工作表,"filterViewId": 2 用于第二张工作表 etc.0,您可以将 filterview 分配给在每次循环迭代期间递增的计数器变量.

例子:

var i=0;
for each (var dataSheet in sheets){ 
  i++;
  ...
  var filterSettings = {
     "filterViewId": i,
        ...

或者,您也可以将 for each 循环替换为 for(var i=1; i<=sheet.length;i++) 循环 - 然后同时遍历 sheetsfilterview

【讨论】:

  • 谢谢,我能够在发布后更正字段部分,但问题是 filterViewId 没有增加 1。如果我在 Sheet 1 上,这可能会有所帮助,并且在filter 有两个在 url 中传递的变量应该是可检索的,GID(工作表 ID)和 FVID(过滤视图 ID)https://docs.google.com/spreadsheets/d/*SpreadsheetID*/edit#*gid=1912501544&fvid=1532254743* 我假设有一种方法可以检索 fvid,就像我们可以检索 sheetIds 但如果没有我可以将每个 fvid 逐页存储在一个数组中吗?
  • 您可以使用 getFilterViewId() 获取 FVID,并将每个 FVID 作为一个元素推送到一个数组中。当您使用循环更新过滤器视图时,您可以遍历数组元素: "filterViewId": myArray[i]
猜你喜欢
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
相关资源
最近更新 更多