[英]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”创建了一个新的过滤器视图,我会
请帮忙,我是应用程序脚本的新手:(
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);
}
}
我相信你的目标如下。
在这种情况下,下面的示例脚本怎么样?
criteria
的属性。 所以在这种情况下,请使用filterSpecs[]
。 参考在使用此脚本之前, 请在 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);
}
当上述脚本运行 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.