CRÉER FACILEMENT DES VUES FILTRÉES
Google Sheets est par essence un outil de travail collaboratif. Et pour ne pas gêner plusieurs collaborateurs, il existe un système de vues filtrées permettant à chacun d'y travailler sans imposer aux autres sa propre vue et son travail.
Mais la construction des vues filtrées peut être assez fastidieuse.
Cet outil permet de créer autant de vues filtrées que de données différentes dans une colonne précise.
Il est indispensable d'activer le service Google Sheets API dans l'éditeur de script.
Le script :
var col = 2 // colonne permettant d'identifier le critère de partage
function onOpen() {
SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
.addItem('👉 Créer/ajouter une vue filtrée pour chaque item de la colonne B', 'setAllFilterViews')
.addItem('👉 Lister les url des vues filtrées pour chaque item de la colonne B', 'listAllFilterViews')
.addSeparator()
.addItem('👉 Supprimer toutes les vues filtrées', 'delAllFilterViews')
.addToUi();
}
function setAllFilterViews() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const sh = ss.getSheets()[0]
var data = sh.getRange(col, col, sh.getLastRow() - 1, 1).getValues().join().split(',').filter(onlyUnique).sort()
var list = getAllFilterViews()
var num = 10000
if (list != null) {
list.forEach(function (item) { num = Math.max(num, item[1]) })
num++
data.forEach(function (item) {
if (list.filter(r => (r[0] == item)).length == 0) {
setFilterView(item, num++, item, 1)
}
})
}
else {
num++
data.forEach(function (item) {
setFilterView(item, num++, item, 1)
})
}
SpreadsheetApp.getActive().toast('Vues filtrées créées !')
}
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
function listAllFilterViews() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var list = getAllFilterViews()
ss.getSheetByName('liste').activate()
ss.getSheetByName('liste').getDataRange().clear()
try { ss.getSheetByName('liste').getRange(1, 1, list.length, list[0].length).setValues(list) } catch (e) { }
SpreadsheetApp.getActive().toast('Fonction à développer en fonction du besoin !')
}
function getAllFilterViews() {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var id = ss.getId();
var gid = ss.getSheets()[0].getSheetId()
var myFilterViews = Sheets.Spreadsheets.get(id, {
fields: 'sheets/filterViews',
}).sheets[0].filterViews;
var list = []
myFilterViews.forEach(function (f) {
Logger.log(JSON.stringify(f))
var url = 'https://docs.google.com/spreadsheets/d/' + id + '/edit#gid=' + gid + '&fvid=' + f.filterViewId
list.push([f.title, f.filterViewId, url])
})
return (list)
}
catch (e) {
return
}
};
function setFilterView(nomFiltre, num, critere, colonne) {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const resource = {
"requests": [{
"addFilterView": {
"filter": {
"filterViewId": num,
"title": nomFiltre,
"range": {
"sheetId": ss.getSheets()[0].getSheetId(),
"startRowIndex": 0, "startColumnIndex": 0, "endColumnIndex": ss.getSheets()[0].getLastColumn()
},
"filterSpecs": [
{
"filterCriteria": {
"condition": {
"type": "TEXT_CONTAINS", "values": [{ "userEnteredValue": critere }]
}
},
"columnIndex": colonne
}
]
}
}
}]
};
Sheets.Spreadsheets.batchUpdate(resource, ss.getId());
}
function delAllFilterViews() {
try {
var ssId = SpreadsheetApp.getActive().getId();
Sheets.Spreadsheets.batchUpdate(
{
requests: Sheets.Spreadsheets.get(ssId, {
fields: 'sheets/filterViews/filterViewId',
}).sheets[0].filterViews.map(function (e) {
return {
deleteFilterView: {
filterId: e['filterViewId']
}
};
}),
},
ssId
);
SpreadsheetApp.getActive().toast('Vues filtrées supprimées !')
}
catch (e) {
SpreadsheetApp.getActive().toast('Pas de vue filtrée !')
}
}
Commentaires
Enregistrer un commentaire