Exporter données Google Sheet A vers Google Sheet B
1-
J'ai ajouté la ligne des titres (ligne 2) dans la base de données
2-
Ta feuille ne s'appelle pas Fiche technique mais Fiche_Technique, donc
const nomFeuilleSaisie = 'Fiche_Technique'J'ai toutefois fait une sauvegarde de la feuille
3-
Avais-tu lancé le menu / activer ?
... cela devrait fonctionner une fois l'application activée ...
4-
je modifierai demain pour tenir compte des formules éventuelles
J'ai enlevé la contrainte de mettre des données aux 4 coins, et j'ai tenu compte des formules éventuelles.
// mike steelson
const nomFichierBaseDeDonnees = 'myDataBase'
const nomFeuilleBaseDeDonnees = 'BdD'
const nomFeuilleSaisie = 'Fiche technique'
const rangeID = 'C3'
const doc = SpreadsheetApp.getActiveSpreadsheet()
const saisie = doc.getSheetByName(nomFeuilleSaisie)
function trigger() {
var d = new Date();
ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t))
ScriptApp.newTrigger("onSpeEdit")
.forSpreadsheet(doc)
.onEdit()
.create();
SpreadsheetApp.getActive().toast('Le script est maintenant activé !')
}
function onOpen() {
SpreadsheetApp.getUi().createMenu('↓ MENU ↓')
.addItem('👉 Activer l\'application', 'trigger')
.addItem('👉 Appliquer les modifications', 'saisir')
.addToUi();
}
function onSpeEdit(e) {
var f = e.source.getActiveSheet();
var r = e.source.getActiveRange();
if (f.getName() == nomFeuilleSaisie && r.getA1Notation() == rangeID) {
var bdd = SpreadsheetApp.openById(getFileId(nomFichierBaseDeDonnees)).getSheetByName(nomFeuilleBaseDeDonnees)
var ids = bdd.getRange('A:A').getValues().filter(r => r[0] != '').flat()
if (ids.indexOf(r.getValue()) >= 2) {
afficher(ids.indexOf(r.getValue()) + 1)
}
else {
var response = Browser.msgBox('Identifiant inconnu', 'Voulez-vous ajouter cet identifiant ?', Browser.Buttons.YES_NO);
if (response == "yes") {
ligne = bdd.getLastRow() + 1
bdd.getRange(ligne, 1).setValue(r.getValue())
afficher(ligne)
} else {
r.setValue(e.oldValue)
}
}
}
}
function saisir() {
var bdd = SpreadsheetApp.openById(getFileId(nomFichierBaseDeDonnees)).getSheetByName(nomFeuilleBaseDeDonnees)
var ids = bdd.getRange('A:A').getValues().filter(r => r[0] != '').flat()
var id = ids.indexOf(saisie.getRange(rangeID).getValue()) + 1
var data = bdd.getRange(id, 1, 1, bdd.getLastColumn()).getValues()
var coord = coordXY()
var maxi = maxXY()
var rng = saisie.getRange(1,1,maxi[0]+1,maxi[1]+1)
var myForm = rng.getValues()
for (var i = 0; i < coord.length; i++) { if (coord[i][0] != -1) { data[0][i] = myForm[coord[i][0]][coord[i][1]] } }
bdd.getRange(id, 1, 1, bdd.getLastColumn()).setValues(data)
SpreadsheetApp.getActive().toast('Modification(s) enregistrée(s) !', 'Fin de script 🗃️')
}
function afficher(id) {
var bdd = SpreadsheetApp.openById(getFileId(nomFichierBaseDeDonnees)).getSheetByName(nomFeuilleBaseDeDonnees)
var data = bdd.getRange(id, 1, 1, bdd.getLastColumn()).getValues().flat()
var coord = coordXY()
var maxi = maxXY()
var rng = saisie.getRange(1,1,maxi[0]+1,maxi[1]+1)
var myForm = rng.getValues()
var formules = rng.getFormulas()
for (var i = 0; i < coord.length; i++) { if (coord[i][0] != -1) { myForm[coord[i][0]][coord[i][1]] = data[i] } }
rng.setValues(myForm)
for (var i=0;i<formules.length;i++){
for (j=0;j<formules[i].length;j++){
if (formules[i][j]!=''){saisie.getRange(i+1,j+1).setFormula(formules[i][j])}
}
}
SpreadsheetApp.getActive().toast('Élément affiché !', 'Fin de script 🗃️')
}
function coordXY() {
var coord = []
var bdd = SpreadsheetApp.openById(getFileId(nomFichierBaseDeDonnees)).getSheetByName(nomFeuilleBaseDeDonnees)
var adresses = bdd.getRange(1, 1, 1, bdd.getLastColumn()).getValues().flat()
adresses.forEach(function (ad) {
if (ad != '') { coord.push([ad.match(/\d+/)[0] - 1, letterToColumn(ad.match(/\D+/)[0]) - 1]) }
else { coord.push([-1, -1]) }
})
return coord
}
function maxXY() {
var maxi = [0, 0]
var bdd = SpreadsheetApp.openById(getFileId(nomFichierBaseDeDonnees)).getSheetByName(nomFeuilleBaseDeDonnees)
var adresses = bdd.getRange(1, 1, 1, bdd.getLastColumn()).getValues().flat()
adresses.forEach(function (ad) {
if (ad != '') {
maxi[0] = Math.max((ad.match(/\d+/)[0] - 1), maxi[0]);
maxi[1] = Math.max((letterToColumn(ad.match(/\D+/)[0]) - 1), maxi[1]);
}
})
return maxi
}
function letterToColumn(letter) {
var column = 0, length = letter.length;
for (var i = 0; i < length; i++) { column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1) }
return column;
}
function getFileId(nomDuFicherRecherche) {
var files = DriveApp.getFilesByName(nomDuFicherRecherche);
while (files.hasNext()) {
var file = files.next();
return (file.getId())
}
}C'est un peu long, c'est vraiment le maximum que je m' octroie en longueur de script...
Le fait d'avoir beaucoup de données, beaucoup de formules et une base de données séparée fait que c'est un peu long en affichage, il faut attendre le message en bas à droite.
Première amélioration, remplacer partout
var bdd = SpreadsheetApp.openById(getFileId(nomFichierBaseDeDonnees)).getSheetByName(nomFeuilleBaseDeDonnees)par
var bdd = SpreadsheetApp.openById(' ID du fichier de base de données ').getSheetByName(nomFeuilleBaseDeDonnees)Et si tu n'utilises pas d'appareil android, il est possible de faire un code plus simplet et plus rapide. Ce que je vais faire de toute façon.
Une autre version ++ rapide/réactive, avec une contrainte, la BdD doit être entièrement reprise dans la feuille de saisie (toutes les colonnes doivent avoir une adresse en ligne 1)
Il faut activer le service Google Sheets API
Pas compatible appareils android aujour'hui
// mike steelson
/*
activer le service Google Sheets API
pas de données dans la BdD qui ne soient pas reprises dans la feuille de siaise (ligne 1 remplie sans trou)
*/
const idFichierBaseDeDonnees = '1AQMixdVnpZv5fGpPCW6yKUN8OiIucvWsM6ocOXJ_TgM'
const nomFeuilleBaseDeDonnees = 'BdD'
const nomFeuilleSaisie = 'Fiche technique'
const rangeID = 'C3'
const doc = SpreadsheetApp.getActiveSpreadsheet()
const saisie = doc.getSheetByName(nomFeuilleSaisie)
const bdd = SpreadsheetApp.openById(idFichierBaseDeDonnees).getSheetByName(nomFeuilleBaseDeDonnees)
function onOpen() {
SpreadsheetApp.getUi().createMenu('↓ MENU ↓')
.addItem('👉 Autoriser l\'application', 'autoriser')
.addItem('👉 Activer l\'application', 'trigger')
.addItem('👉 Appliquer les modifications', 'saisir')
.addToUi();
}
function trigger() {
var d = new Date();
ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t))
ScriptApp.newTrigger("onSpeEdit")
.forSpreadsheet(doc)
.onEdit()
.create();
SpreadsheetApp.getActive().toast('Le script est maintenant activé !')
}
function autoriser() {
SpreadsheetApp.getActive().toast('Le script est maintenant autorisé !')
}
function onSpeEdit(e) {
var f = e.source.getActiveSheet();
var r = e.source.getActiveRange();
if (f.getName() == nomFeuilleSaisie && r.getA1Notation() == rangeID) {
var ids = bdd.getRange('A:A').getValues().filter(r => r[0] != '').flat()
if (ids.indexOf(r.getValue()) >= 2) {
afficher(ids.indexOf(r.getValue()) + 1)
}
else {
var response = Browser.msgBox('Identifiant inconnu', 'Voulez-vous ajouter cet identifiant ?', Browser.Buttons.YES_NO);
if (response == "yes") {
ligne = bdd.getLastRow() + 1
bdd.getRange(ligne, 1).setValue(r.getValue())
afficher(ligne)
} else {
r.setValue(e.oldValue)
}
}
}
}
function saisir() {
try {
var ids = bdd.getRange('A:A').getValues().filter(r => r[0] != '').flat()
var id = ids.indexOf(saisie.getRange(rangeID).getValue()) + 1
var adresses = bdd.getRange(1, 1, 1, bdd.getLastColumn()).getValues().flat().filter(ad => ad != '')
const values = Sheets.Spreadsheets.Values.batchGet(doc.getId(), { ranges: adresses.map(e => `'${nomFeuilleSaisie}'!${e}`) })
var data = []
values.valueRanges.forEach(e => data.push(e.values ? e.values.flat().toString() : ""))
bdd.getRange(id, 1, 1, bdd.getLastColumn()).setValues([data])
SpreadsheetApp.getActive().toast('Modification(s) enregistrée(s) !', 'Fin de script 🗃️')
}
catch (e) { Browser.msgBox(e) }
}
function afficher(id) {
try {
var values = bdd.getRange(id, 1, 1, bdd.getLastColumn()).getValues().flat()
var adresses = bdd.getRange(1, 1, 1, bdd.getLastColumn()).getValues().flat()
const data = adresses.map((e, i) =>({ range: `'${nomFeuilleSaisie}'!${e}`, values : [[values[i]]] }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, doc.getId());
SpreadsheetApp.getActive().toast('Élément affiché !', 'Fin de script 🗃️')
}
catch (e) { Browser.msgBox(e) }
}- Messages
- 19
- Excel
- français
- Inscrit
- 07/12/2021
- Emploi
- Responsable développement commercial
Bonjour Mike,
Je regarde et je teste tout ça ce week-end !
Super...
Bon week à toi
Je reste à ta disposition, j'ai eu peur de décourager.