google 工作表中多个过滤视图的超链接,使用应用程序脚本第 2 部分
Hyperlinks of multiple filtered views in google sheets using apps script part2
这是 的扩展:
我有 sheet 个 sheet 个名字(sheet A、B 和 C 列中的 1 个)。
我想要 Sheet 2 , sheet 3 和 Sheet 4.
中的人的销售信息
我想要一个用于 sheet 1 上的过滤视图超链接的应用程序脚本。因此 Sheet 1 上的 A 列应该将您带到 Sheet 2 上的过滤视图。Sheet 1 列 B 名称将在 Sheet 3 中具有筛选视图的超链接。Sheet 1 列 C 名称将在 Sheet 4.
中具有筛选视图的超链接
到目前为止,我的代码仅从 sheet 1 中的一列中获取名称,并从 sheet 2 中获取超链接。如何循环浏览 [=46 中的 A、B 和 C 列=] 1 和 Sheets 2,3,4。这是我目前所拥有的?
如果可能,请提供甚至删除过滤视图的代码,使用相同的方法(我的意思是根据您 select 的列名,删除特定的过滤视图)。当我删除过滤器视图时,我也想清除 Sheet1 上的超链接(因为这些链接将不再存在)
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);
}
示例sheet的图片如下:
Sheet1 有 3 列:A、B、C。我希望 sheet1 列 A 上的超链接来自 sheet 2. [=43= 上的超链接]1 B 列应来自 sheet 3. sheet1 C 列上的超链接应来自 Sheet 4.
我在最后一张图片中附上了过滤器视图的示例图片。 Sheet 1 上 C 列中的“Vincent Lee”应该具有 Sheet4.
中所有“Vincent Lee”记录的超链接
我相信你的目标如下。
- Google 传播sheet 中有一个源 sheet 和 3 个目标 sheet。
- 在“Sheet1”中,值被放入显示图像的“C”、“E”和“G”列中。
- 您想从源 sheet 检索值并使用从源 sheet 检索到的值创建到目标 sheet 的筛选视图。
- 源sheet的每一列对应每个目标sheet。
在这种情况下,下面的示例脚本怎么样?
示例脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
function create_filter_view2() {
// Please set the object for putting the filter views to the destination sheet using the values from the source sheet.
var obj = { src: "Sheet1", dst: [{ name: "Sheet2", range: "C4:C" }, { name: "Sheet3", range: "E4:E" }, { name: "Sheet4", range: "G4:G" }] };
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ssId = ss.getId();
var src = ss.getSheetByName(obj.src);
var values = Sheets.Spreadsheets.Values.batchGet(ssId, { ranges: obj.dst.map(({ range }) => `'${obj.src}'!${range}`) });
obj.dst.forEach(({ name, range }, i) => {
var dst = ss.getSheetByName(name);
var dstId = dst.getSheetId();
var requests = values.valueRanges[i].values.flatMap(([r]) => {
if (r && r.toString() != "") {
return { addFilterView: { filter: { title: r, range: { sheetId: dstId, startRowIndex: 0, startColumnIndex: 0 }, filterSpecs: [{ columnIndex: 1, filterCriteria: { condition: { type: "TEXT_EQ", values: [{ userEnteredValue: r }] } } }] } } };
}
return [];
});
var response = Sheets.Spreadsheets.batchUpdate({ requests }, ssId);
var filter_view_ids = response.replies.map(({ addFilterView: { filter: { filterViewId } } }) => filterViewId);
var c = 0;
var richTextValues = values.valueRanges[i].values.map(e => {
if (e.toString() != "") {
var temp = [SpreadsheetApp.newRichTextValue().setText(e[0]).setLinkUrl(`#gid=${dstId}&fvid=${filter_view_ids[c]}`).build()];
c++;
return temp;
}
return [SpreadsheetApp.newRichTextValue().setText("").build()];
});
src.getRange(range).offset(0, 0, richTextValues.length).setRichTextValues(richTextValues);
});
}
- 在此示例脚本中,为了从分散的范围中检索值,使用了工作表 API。
注:
- 此示例脚本适用于显示图像的 sheet。所以当你的实际情况和他们不一样的时候,脚本可能就不能用了。所以请注意这一点。
参考文献:
这是
我有 sheet 个 sheet 个名字(sheet A、B 和 C 列中的 1 个)。 我想要 Sheet 2 , sheet 3 和 Sheet 4.
中的人的销售信息我想要一个用于 sheet 1 上的过滤视图超链接的应用程序脚本。因此 Sheet 1 上的 A 列应该将您带到 Sheet 2 上的过滤视图。Sheet 1 列 B 名称将在 Sheet 3 中具有筛选视图的超链接。Sheet 1 列 C 名称将在 Sheet 4.
中具有筛选视图的超链接到目前为止,我的代码仅从 sheet 1 中的一列中获取名称,并从 sheet 2 中获取超链接。如何循环浏览 [=46 中的 A、B 和 C 列=] 1 和 Sheets 2,3,4。这是我目前所拥有的?
如果可能,请提供甚至删除过滤视图的代码,使用相同的方法(我的意思是根据您 select 的列名,删除特定的过滤视图)。当我删除过滤器视图时,我也想清除 Sheet1 上的超链接(因为这些链接将不再存在)
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);
}
示例sheet的图片如下:
Sheet1 有 3 列:A、B、C。我希望 sheet1 列 A 上的超链接来自 sheet 2. [=43= 上的超链接]1 B 列应来自 sheet 3. sheet1 C 列上的超链接应来自 Sheet 4. 我在最后一张图片中附上了过滤器视图的示例图片。 Sheet 1 上 C 列中的“Vincent Lee”应该具有 Sheet4.
中所有“Vincent Lee”记录的超链接我相信你的目标如下。
- Google 传播sheet 中有一个源 sheet 和 3 个目标 sheet。
- 在“Sheet1”中,值被放入显示图像的“C”、“E”和“G”列中。
- 您想从源 sheet 检索值并使用从源 sheet 检索到的值创建到目标 sheet 的筛选视图。
- 源sheet的每一列对应每个目标sheet。
在这种情况下,下面的示例脚本怎么样?
示例脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
function create_filter_view2() {
// Please set the object for putting the filter views to the destination sheet using the values from the source sheet.
var obj = { src: "Sheet1", dst: [{ name: "Sheet2", range: "C4:C" }, { name: "Sheet3", range: "E4:E" }, { name: "Sheet4", range: "G4:G" }] };
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ssId = ss.getId();
var src = ss.getSheetByName(obj.src);
var values = Sheets.Spreadsheets.Values.batchGet(ssId, { ranges: obj.dst.map(({ range }) => `'${obj.src}'!${range}`) });
obj.dst.forEach(({ name, range }, i) => {
var dst = ss.getSheetByName(name);
var dstId = dst.getSheetId();
var requests = values.valueRanges[i].values.flatMap(([r]) => {
if (r && r.toString() != "") {
return { addFilterView: { filter: { title: r, range: { sheetId: dstId, startRowIndex: 0, startColumnIndex: 0 }, filterSpecs: [{ columnIndex: 1, filterCriteria: { condition: { type: "TEXT_EQ", values: [{ userEnteredValue: r }] } } }] } } };
}
return [];
});
var response = Sheets.Spreadsheets.batchUpdate({ requests }, ssId);
var filter_view_ids = response.replies.map(({ addFilterView: { filter: { filterViewId } } }) => filterViewId);
var c = 0;
var richTextValues = values.valueRanges[i].values.map(e => {
if (e.toString() != "") {
var temp = [SpreadsheetApp.newRichTextValue().setText(e[0]).setLinkUrl(`#gid=${dstId}&fvid=${filter_view_ids[c]}`).build()];
c++;
return temp;
}
return [SpreadsheetApp.newRichTextValue().setText("").build()];
});
src.getRange(range).offset(0, 0, richTextValues.length).setRichTextValues(richTextValues);
});
}
- 在此示例脚本中,为了从分散的范围中检索值,使用了工作表 API。
注:
- 此示例脚本适用于显示图像的 sheet。所以当你的实际情况和他们不一样的时候,脚本可能就不能用了。所以请注意这一点。