Une proposition. Le principe est le suivant
- l'onglet "Annotations" reçoit toutes les annotations (l'identifiant est le couple date~produit)
- le calendrier comporte dans toutes les cases comprises entre ligne 10 et 28, et entre les 5ème et 35ème colonne la formule suivante
=iferror(vlookup(text(E$8;"yyyy-MM-dd")&"~"&$C10; Annotations!$A:$B ;2;0))
- en cas de modification d'une cellule, la valeur est stockée dans l'onglet Annotations et la formule est regénérée
- j'ai prévu le cas où il y a plusieurs modifications de cellules en même temps
// Mettre Europe/Paris dans appsscript.json
function onEdit(e) {
var sh = e.source.getActiveSheet()
var editRange = {
top: 10, // numéro de la première ligne
bottom: 28, // numéro de dernière ligne (non utilisé ici)
left: 5, // numéro de la première colonne
right: 35 // numéro de la dernière colonne
};
var notes = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('annotations')
var der = notes.getLastRow()
var ids = notes.getRange(1, 1, der, 1).getValues().flat()
var n = 1
for (var i = e.range.rowStart; i <= e.range.rowEnd; i++) {
if (i >= editRange.top && i <= editRange.bottom) {
for (var j = e.range.columnStart; j <= e.range.columnEnd; j++) {
if (j >= editRange.left && j <= editRange.right) {
var id =
Utilities.formatDate(new Date(sh.getRange(8, j).getValue()), Session.getScriptTimeZone(), "yyyy-MM-dd")
+ '~'
+ sh.getRange(i, 3).getValue()
if (ids.indexOf(id) != -1) {
notes.getRange(ids.indexOf(id) + 1, 1, 1, 2).setValues([[id, sh.getRange(i, j).getValue()]])
}
else {
notes.getRange(der + n++, 1, 1, 2).setValues([[id, sh.getRange(i, j).getValue()]])
}
sh.getRange(i, j)
.setFormula(`=iferror(vlookup(text(${columnToLetter(j)}$8;"yyyy-MM-dd")&"~"&$C${i}; Annotations!$A:$B ;2;0))`)
}
}
}
}
}
function columnToLetter(column) {
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
}