我想創建超鏈接(在第一個選項卡/作業表上有一個名稱串列。單擊時每個名稱都應該轉到另一個作業表中包含記錄的過濾器視圖)。示例:單擊作業表 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”創建了一個新的過濾器視圖,我會
- 喜歡提供名稱串列(不僅限于 John Smith)來創建多個過濾器視圖。
- 對于每個過濾器視圖,我想要一個創建的鏈接(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);
}
}
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您有 2 張“Sheet1”和“Sheet2”。“Sheet1”和“Sheet2”的單元格顯示在您的問題中。
- 您想使用“Sheet1”的“A”列中的值為“Sheet2”的“B”列創建過濾器視圖。
- “A”列的單元格具有過濾視圖的超鏈接。單擊單元格時,您希望跳轉到與單元格值對應的過濾器視圖。
在這種情況下,下面的示例腳本怎么樣?
修改點:
- 似乎
criteria不推薦使用的屬性。所以在這種情況下,請使用filterSpecs[]. 參考 - 為了設定過濾視圖的超鏈接,使用了 RichTextValue。
示例腳本:
在使用此腳本之前,請在 Advanced Google services 中啟用 Sheets 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); }此示例腳本適用于腳本中顯示的示例電子表格。因此,當您的實際電子表格的結構與示例不同時,該腳本可能無法使用。請注意這一點。
參考:
- 方法:電子表格.batchUpdate
- AddFilterViewRequest
- 過濾視圖
- setRichTextValues(值)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405408.html
標籤:
上一篇:元素.innerText不顯示
下一篇:需要幫助轉換GraphQL結果
