google 工作表中使用应用程序脚本过滤视图的超链接

Hyperlinks of filtered views in google sheets using apps script

我想创建 hyperlinks(在第一个 tab/sheet 上有一个名字列表。单击时每个名字都应该转到另一个 sheet 中有记录的过滤器视图).示例:单击 sheet 1 中的“John Smith”应该将我带到一个筛选视图,其中包含 sheet 2 中包含 John Smith 的所有行。

例子tables Sheet 1 table 有名字

Names
John Smith
Ryan Jones
Tony Welsh

Sheet 2 有销售信息

Sales_id    Name
1245    John Smith
1234    John Smith
1256    Tony Welsh
5674    Ryan Jones
2345    Tony Welsh
1557    John Smith
9830    Ryan Jones

我想要每个名字的过滤视图。因此,John Smith 应该有来自 sheet 2(sales:ids:1245、1234 和 1557)的 3 条记录的过滤视图。这些过滤后的视图将具有 URLS,我会在 sheet 1 中为每个人的名字 hyperlink

到目前为止,我的代码只为“John Smith”创建了一个新的 Filterview 我会

  1. 喜欢提供姓名列表(不限于 John Smith)以创建多个筛选视图。
  2. 对于每个过滤器视图,我都想要一个创建的 link(fvid),这样我就可以将它用作第一个选项卡上每个名称的 hyperlink

请帮忙,我是应用程序脚本的新手:(

function filter_view (){
  const spreadsheetId = SpreadsheetApp.getActiveSpreadsheet();
 
  const sheetId = spreadsheetId.getActiveSheet().getSheetId();
  
  const addFilterViewRequest = [
    {
       'addFilterView' : {
         filter : {
           title : 'John Smith', // Title Of filter view & make sure no space in title
           range : {
             sheetId : sheetId, // The filter view sheetId
             'startRowIndex': 0,
             'startColumnIndex':0,
             
           }, // Using comma to seprate different conditional values
            'criteria': {
              1:{  // This number the column you are indexing in the spreadsheet 
               'condition': {
                 'type': "TEXT_EQ",
                 'values':[
                   {
                     "userEnteredValue" :'John Smith'                      
                     
                   },

                 ],
               }
               
             }
           
         }

       }
    }
    }
  ]
    


   Sheets.Spreadsheets.batchUpdate({ requests: addFilterViewRequest },spreadsheetId.getId());
   // update the spreadsheet using the addFilterViewRequest 
    
}

更新 1:弄清楚如何传递数组以获得不同的过滤视图。我能够在控制台中打印 fvid。但我需要在 sheet 中获取 fvid(或完整的 url 或过滤器视图)1。这是更新后的代码



function create_filter_view (){
  var list_names = ["John Smith","Ryan Jones","Tony Welsh"];//Add names you want views for
  for(var i = 0; i < list_names.length; i++){
          
      const spreadsheetId = SpreadsheetApp.getActiveSpreadsheet();
    
      const sheetId = spreadsheetId.getActiveSheet().getSheetId();
      
      const addFilterViewRequest = [
        {
          'addFilterView' : {
            filter : {
              title : list_names[i], // Title Of filter view & make sure no space in title
              range : {
                sheetId : sheetId, // The filter view sheetId
                'startRowIndex': 0,
                'startColumnIndex':0,
                
              }, // Using comma to seprate different conditional values
                'criteria': {
                  1:{  // This number the column you are indexing in the spreadsheet 
                  'condition': {
                    'type': "TEXT_EQ",
                    'values':[
                      {
                        "userEnteredValue" :list_names[i]                      
                        
                      },

                    ],
                  }
                  
                }
              
            }

          }
        }
        }
      ]
        


      response = Sheets.Spreadsheets.batchUpdate({ requests: addFilterViewRequest },spreadsheetId.getId());
      // update the spreadsheet using the addFilterViewRequest 
      filter_view_id = response['replies'][0]['addFilterView']['filter']['filterViewId']
      console.log(filter_view_id);
      

      
}

    
}

我相信你的目标如下。

  • 您有 2 张“Sheet1”和“Sheet2”。 “Sheet1”和“Sheet2”的单元格显示在您的问题中。
  • 您想使用“Sheet1”的“A”列中的值为“Sheet2”的“B”列创建过滤视图。
  • “A”列的单元格具有筛选视图的超链接。单击单元格时,您想跳转到单元格值对应的筛选视图。

在这种情况下,下面的示例脚本怎么样?

修改点:

  • criteria 的 属性 似乎已弃用。所以在这种情况下,请使用filterSpecs[]Ref
  • 为了设置过滤视图的超链接,使用了 RichTextValue。

示例脚本:

在您使用此脚本之前,please enable Sheets API at Advanced Google services

function create_filter_view() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var sheet1 = ss.getSheetByName("Sheet1");
  var sheet2 = ss.getSheetByName("Sheet2");
  var sheetId2 = sheet2.getSheetId();
  var range1 = sheet1.getRange("A2:A" + sheet1.getLastRow());
  var values1 = range1.getValues();
  var requests = values1.map(([a]) => ({ addFilterView: { filter: { title: a, range: { sheetId: sheetId2, startRowIndex: 0, startColumnIndex: 0 }, filterSpecs: [{ columnIndex: 1, filterCriteria: { condition: { type: "TEXT_EQ", values: [{ userEnteredValue: a }] } } }] } } }));
  var response = Sheets.Spreadsheets.batchUpdate({ requests }, ssId);
  var filter_view_ids = response.replies.map(({ addFilterView: { filter: { filterViewId } } }) => filterViewId);
  var richTextValues = filter_view_ids.map((e, i) => [SpreadsheetApp.newRichTextValue().setText(values1[i][0]).setLinkUrl(`#gid=${sheetId2}&fvid=${e}`).build()]);
  range1.setRichTextValues(richTextValues);
}
  • 当此脚本为 运行 时,将从“Sheet1”的“A”列中检索值,并使用检索到的值为“Sheet2”创建筛选视图。在这种情况下,“B”列被过滤。然后,过滤视图的链接设置为“Sheet1”的“A”列。

注:

  • 当上述脚本运行2次时,创建了相同的过滤视图。所以,当你想重置过滤视图(删除所有过滤视图)时,你也可以使用下面的脚本。

      function deleteAllFinterViews() {
        var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
        var ids = Sheets.Spreadsheets.get(ssId).sheets.flatMap(s => s.filterViews ? s.filterViews.map(e => ({ deleteFilterView: { filterId: e.filterViewId } })) : []);
        if (ids.length > 0) Sheets.Spreadsheets.batchUpdate({ requests: ids }, ssId);
      }
    
  • 此示例脚本适用于在脚本中显示的示例电子表格。因此,当您的实际电子表格的结构与您的示例不同时,脚本可能无法使用。请注意这一点。

参考文献: