proposition à tester/triturer, après avoir fait le ménage dans le dossier !!
function onSpeEdit(e) { // définir déclencheur
var sheet = e.source.getActiveSheet();
var cel = e.source.getActiveRange();
if (sheet.getName() == 'Feuille 1' && cel.getValue() == true && cel.getColumn() == sheet.getLastColumn()) {
if (sheet.getRange(cel.getRow(), 1) != '') {
var valeurs = sheet.getRange(cel.getRow(), 1, 1, sheet.getLastColumn()).getValues().flat()
var param = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('parameters')
var [dossier, template] = param.getRange('B1:B2').getValues().flat()
var onglet = SpreadsheetApp.openById(template).getSheets()[0].getName()
var url = rechercherUrl(sheet.getRange(cel.getRow(), 1))
var urlSelonNom = checkFileUrl(dossier, valeurs[0])
if (url != null && url == urlSelonNom) {
var id = getIdFromUrl(url)
Browser.msgBox(`Le fichier "${valeurs[0]}" existe !`)
} else if (url != null && url != urlSelonNom && urlSelonNom != 'none') {
Browser.msgBox(`Schmilblick ... le fichier "${valeurs[0]}" existe bien mais ne correspond pas à l'url !\nPas de mise à jour ...`)
return
} else if (url == null && urlSelonNom != 'none'){
Browser.msgBox(`Schmilblick ... le fichier "${valeurs[0]}" existe déjà !\nPas de mise à jour ...`)
return
} else {
var file = DriveApp.getFileById(template).makeCopy(valeurs[0], DriveApp.getFolderById(dossier))
var id = file.getId()
creerHyperlink(valeurs[0], file.getUrl(), sheet.getRange(cel.getRow(), 1))
Browser.msgBox(`Le fichier "${valeurs[0]}" a été créé !`)
}
update(onglet, param.getRange('A4:B' + param.getLastRow()).getValues(), valeurs, id)
Browser.msgBox('Mis à jour ok !')
}
cel.setValue(!cel.getValue())
}
}
function rechercherUrl(rng) { return rng.getRichTextValue().getLinkUrl() }
function getIdFromUrl(url) { return url.match(/[-\w]{25,}/) }
function creerHyperlink(nom, url, rng) {
rng.setRichTextValue(SpreadsheetApp.newRichTextValue().setText(nom).setLinkUrl(url).build())
}
function update(onglet, correspondances, valeurs, id) { // activer le service Sheets API
const ranges = [], values = []
correspondances.forEach(tab => {
ranges.push(onglet + '!' + tab[1])
values.push(valeurs[[tab[0] - 1]])
})
const data = ranges.map((e, i) => ({ range: e, values: [[values[i]]] }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, id);
}
function checkFileUrl(folderID, name) {
var files = DriveApp.getFolderById(folderID).searchFiles(`title='${name}' and mimeType='${MimeType.GOOGLE_SHEETS}' and trashed=false`);
var file = files.hasNext() && files.next();
if (file) { return file.getUrl() } else { return 'none' }
}