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
我会
- 喜欢提供姓名列表(不限于 John Smith)以创建多个筛选视图。
- 对于每个过滤器视图,我都想要一个创建的 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);
}
此示例脚本适用于在脚本中显示的示例电子表格。因此,当您的实际电子表格的结构与您的示例不同时,脚本可能无法使用。请注意这一点。
参考文献:
我想创建 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 我会
- 喜欢提供姓名列表(不限于 John Smith)以创建多个筛选视图。
- 对于每个过滤器视图,我都想要一个创建的 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); }
此示例脚本适用于在脚本中显示的示例电子表格。因此,当您的实际电子表格的结构与您的示例不同时,脚本可能无法使用。请注意这一点。