为工作簿中的所有工作表更新多个过滤器视图范围的脚本
Script to Update Multiple Filter View Ranges for all sheets in workbook
这里有类似但不同的问题。
我在同一个工作簿中有几个 sheet,我想在其中设置一个触发器,以便在每个 sheet.
的所有筛选视图中更新范围。
我最好的解决方案是为工作簿中的每个 sheet 创建一个文件吗?
在你的情况下,下面的修改脚本怎么样?在这次修改中,我修改了.
处的示例脚本
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。并且,请设置要更新的 sheet 个名称。
function UpdateFilterView() {
var sheetNames = ["Sheet1", "Sheet3",,,]; // Please set the sheet names you want to update.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetId = ss.getId();
var sheets = Sheets.Spreadsheets.get(spreadsheetId, { ranges: sheetNames, fields: "sheets(filterViews)" }).sheets;
var requests = sheets.flatMap((s, i) => {
var dataSheet = ss.getSheetByName(sheetNames[i]);
var endRowIndex = dataSheet.getLastRow();
var endColumnIndex = dataSheet.getLastColumn();
var sheetId = dataSheet.getSheetId();
return s.filterViews.map(({ filterViewId }) => ({ updateFilterView: { filter: { filterViewId, range: { sheetId, startRowIndex: 0, endRowIndex, startColumnIndex: 0, endColumnIndex } }, fields: "*" } }));
});
if (requests.length == 0) return;
Sheets.Spreadsheets.batchUpdate({ requests: requests }, spreadsheetId);
}
- 当此脚本为 运行 时,Google Spreadsheet 中特定 sheet 的所有过滤器视图都会更新。在这种情况下,使用一个API。
注:
例如,当你想在一个Google Spreadsheet中的所有sheet中反映这个脚本时,你也可以使用下面的示例脚本。
function sample() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetId = ss.getId();
var sheets = Sheets.Spreadsheets.get(spreadsheetId, { fields: "sheets(filterViews)" }).sheets;
var allSheets = ss.getSheets();
var requests = sheets.flatMap((s, i) => {
var dataSheet = allSheets[i];
var endRowIndex = dataSheet.getLastRow();
var endColumnIndex = dataSheet.getLastColumn();
var sheetId = dataSheet.getSheetId();
return s.filterViews ? s.filterViews.map(({ filterViewId }) => ({ updateFilterView: { filter: { filterViewId, range: { sheetId, startRowIndex: 0, endRowIndex, startColumnIndex: 0, endColumnIndex } }, fields: "*" } })) : [];
});
if (requests.length == 0) return;
Sheets.Spreadsheets.batchUpdate({ requests: requests }, spreadsheetId);
}
参考文献:
我在同一个工作簿中有几个 sheet,我想在其中设置一个触发器,以便在每个 sheet.
的所有筛选视图中更新范围。我最好的解决方案是为工作簿中的每个 sheet 创建一个文件吗?
在你的情况下,下面的修改脚本怎么样?在这次修改中,我修改了
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。并且,请设置要更新的 sheet 个名称。
function UpdateFilterView() {
var sheetNames = ["Sheet1", "Sheet3",,,]; // Please set the sheet names you want to update.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetId = ss.getId();
var sheets = Sheets.Spreadsheets.get(spreadsheetId, { ranges: sheetNames, fields: "sheets(filterViews)" }).sheets;
var requests = sheets.flatMap((s, i) => {
var dataSheet = ss.getSheetByName(sheetNames[i]);
var endRowIndex = dataSheet.getLastRow();
var endColumnIndex = dataSheet.getLastColumn();
var sheetId = dataSheet.getSheetId();
return s.filterViews.map(({ filterViewId }) => ({ updateFilterView: { filter: { filterViewId, range: { sheetId, startRowIndex: 0, endRowIndex, startColumnIndex: 0, endColumnIndex } }, fields: "*" } }));
});
if (requests.length == 0) return;
Sheets.Spreadsheets.batchUpdate({ requests: requests }, spreadsheetId);
}
- 当此脚本为 运行 时,Google Spreadsheet 中特定 sheet 的所有过滤器视图都会更新。在这种情况下,使用一个API。
注:
例如,当你想在一个Google Spreadsheet中的所有sheet中反映这个脚本时,你也可以使用下面的示例脚本。
function sample() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var spreadsheetId = ss.getId(); var sheets = Sheets.Spreadsheets.get(spreadsheetId, { fields: "sheets(filterViews)" }).sheets; var allSheets = ss.getSheets(); var requests = sheets.flatMap((s, i) => { var dataSheet = allSheets[i]; var endRowIndex = dataSheet.getLastRow(); var endColumnIndex = dataSheet.getLastColumn(); var sheetId = dataSheet.getSheetId(); return s.filterViews ? s.filterViews.map(({ filterViewId }) => ({ updateFilterView: { filter: { filterViewId, range: { sheetId, startRowIndex: 0, endRowIndex, startColumnIndex: 0, endColumnIndex } }, fields: "*" } })) : []; }); if (requests.length == 0) return; Sheets.Spreadsheets.batchUpdate({ requests: requests }, spreadsheetId); }