繁体   English   中英

使用应用程序脚本在谷歌表格中过滤视图的超链接

[英]Hyperlinks of filtered views in google sheets using apps script

我想创建超链接(在第一个选项卡/工作表上有一个名称列表。单击时每个名称都应 go 到带有另一工作表中记录的过滤器视图)。 示例:单击工作表 1 中的“John Smith”应将我带到一个过滤视图,其中包含工作表 2 中包含 John Smith 的所有行。

示例表工作表 1 表具有名称

Names
John Smith
Ryan Jones
Tony Welsh

表 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 应该有来自工作表 2 的 3 条记录的过滤视图(sales:ids: 1245,1234 和 1557)。 这些过滤后的视图将具有 URL,我将在表 1 中为每个人的姓名提供超链接

到目前为止,我的代码只为“John Smith”创建了一个新的过滤器视图,我会

  1. 喜欢提供名称列表(不仅限于 John Smith)来创建多个过滤器视图。
  2. 对于每个过滤器视图,我想要一个创建的链接(fvid),以便我可以将它用作第一个选项卡上每个名称的超链接

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

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。 但我需要在表 1 中获取 fvid(或完整的 url 或过滤器视图)。这是更新的代码



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[] 参考
  • 为了设置过滤视图的超链接,使用了 RichTextValue。

示例脚本:

在使用此脚本之前, 请在 Google 高级服务中启用表格 API

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); }
  • 此示例脚本适用于脚本中显示的示例电子表格。 因此,当您的实际电子表格的结构与示例不同时,该脚本可能无法使用。 请注意这一点。

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM