Je travaille pour automatiser une feuille Google sur Google Calendar, mais je suis coincé.
J'ai un tableau de chaînes qui correspondent aux heures p> et voulez une sortie une chaîne p> Je dois écrire ceci dans le script d'application Google, toutes les suggestions? P> Je suis nouveau dans le script de Google App et avoir du mal à écrire la fonction. Mon processus initial était de convertir la gamme de chaînes aux titres militaires et de créer deux boucles, mais je suis sûr qu'il existe un moyen plus efficace de le faire. P> Merci pour l'aide! P> Ceci est mon code actuel: p> p> var time = [8, 9, 10, 2, 3, 4]
// if (currentTime == 13) {currentTime -= 12;}
function timeRange(cellInput, hourList) {
var start = parseInt(hourList[0]);
for (var i = 1; i < hourList.length; ++i) {
if (hourList[i] == start + i) {
var end = parseInt(hourList[i]);
} else {
cellInput.setValue(start + " - " + (end + 1));
}
}
}
function soloTime(cellInput, hour) {
//convert hour string to hour
var hour = parseInt(hour)
var start = hour
var end = hour + 1
cellInput.setValue(start + "-" + end);
}
3 Réponses :
Vous pouvez vérifier le prédécesseur et collecter les gammes.
p>
var time = [8, 9, 10, 2, 3, 4, 11, 12, 1], range = time .reduce((r, t, i, a) => { if (a[i - 1] % 12 + 1 === t) { r[r.length - 1][1] = t; } else { r.push([t]); } return r; }, []) .map(a => a.join('-')) .join(', '); console.log(range);
Allez, il est assez expliqué.
Au moins c'est sur plusieurs lignes;)))
Merci pour l'entrée! Pouvez-vous expliquer ce que R, T, I et une valeur représentent?
r code> est l'accumulateur, le résultat temporaire,
t code> est la valeur de l'heure,
i code> l'index de l'élément réel et
A code> est le tableau qui est réellement itéré.
Est-ce ce que vous recherchez?
p>
const timeToRange = (arr) => { const mins = arr .filter((x, i, arr) => x !== arr[i - 1] + 1); const maxs = arr .filter((x, i, arr) => x !== arr[i + 1] - 1) .map(x => x + 1); return mins .map((x, i) => [x, maxs[i]].join('-')) .join(', '); }; console.log( timeToRange([8, 9, 10, 2, 3, 4]) );
@mplungjan merci! En fait, je ne connaissais pas cette fonctionnalité.
Vous pouvez conserver le début de chaque gamme, puis itérer jusqu'à ce que la valeur actuelle ne correspond pas à la précédente, puis prenez la précédente et le début pour créer une plage, les récupérer dans une matrice, et c'est tout.
const result = []; let start = time[0]; let previous = time[0]; // Start at the second position, and go over the arrays length by one, so tgat the last range gets added too for(const value of time.slice(1).concat(Infinity)) { // if the range isn't continuous (12 to 1 is continuous) if((value - previous) % 12 !== 1) { // Add the previous range, start the new range here result.push(start + "-" + previous); start = value; } previous = value; } console.log(result.join(", "));
Partager vos recherches aide tout le monde. Dites-nous ce que vous avez essayé et pourquoi cela n'a pas répondu à vos besoins. Cela démontre que vous avez pris le temps d'essayer de vous aider, cela nous évite de réitérer des réponses évidentes, et surtout, il vous aide à obtenir une réponse plus spécifique et plus pertinente! Voir aussi: Comment demander
Décomposer votre problème. Faites une première passe sur votre matrice pour générer des séquences, puis transformer ces séquences en leur représentation respective à base de cordes. Il sera plus facile de gérer les gammes de 2 éléments de cette façon, si vous voulez 10, 11 au lieu de 10-11.
Carte ou réduire serait des méthodes intéressantes pour enquêter ici
Je vous ai créé un extrait. Veuillez le mettre à jour afin qu'il produit (renvoie) une valeur que vous pouvez consoler.log in a exemple de reproductible minimal