Ich versuche eine Skriptfunktion zu schreiben, die das Javascript aufruft Math.random()
, um eine Zufallszahl zwischen [0, 1) zu generieren, wie folgt:
function f() {
return Math.random();
}
und ich nenne es aus einer Zelle:
Jedes Mal, wenn ich die Tabelle aktualisiere (mit F5oder Ctrl+ R), wird dieselbe Nummer zurückgegeben.
Der Grund, warum ich die Tabellenkalkulationsfunktion nicht verwende, RAND()
ist, dass ich einige komplizierte Berechnungen durchführen möchte f()
. Ich habe versucht, RAND()
einen Parameter aus der Tabelle zu übergeben und den Parameter zurückzugeben, aber in diesem Fall gibt diese Funktion niemals Folgendes zurück:
Gibt es eine Möglichkeit, innerhalb einer Funktion eine aktualisierbare Zufallszahl zu generieren?
Antworten:
Kurze Antwort
Verwenden Sie anstelle einer benutzerdefinierten Funktion nach Möglichkeit eine integrierte Funktion oder eine durch ein Ereignis ausgelöste Funktion.
Erläuterung
Wie im OP erwähnt, verfügt Google Sheets über eine integrierte Funktion, um Zufallszahlen zwischen 0 und 1: RAND zurückzugeben .
In Fällen, in denen komplexe Berechnungen erforderlich sind, die mit integrierten Funktionen nicht möglich oder effizient sind, besteht eine Alternative in der Verwendung von Google Apps Script. Beachten Sie, dass benutzerdefinierte Funktionen nur dann neu berechnet werden, wenn sich eines ihrer Argumente ändert. Auf der anderen Seite sollten ihre Argumente deterministisch sein. Daher werden Funktionen wie NOW (), TODAY (), RAND () und RANDBETWEEN () zurückgegeben Ein Fehler, selbst wenn sie in Tabellenkalkulationsfunktionen anderer Funktionen verschachtelt oder indirekt durch Verweise eingeschlossen sind.
Google Apps Scripts bietet zwei Arten von Ereignissen: einfache und installierbare. Weitere Informationen finden Sie unter https://developers.google.com/apps-script/guides/triggers/ .
Beispiel
Der folgende Code aktualisiert die angegebene Einzelzellenreferenz jedes Mal, wenn ein Benutzer die Tabelle mit einer Zufallszahl bearbeitet, die von einem generiert wird
Math.random()
.Verweise
quelle
Hinweis: Diese Antwort war nur für die alten Google Spreadsheets gültig. Derzeit nicht-deterministische Funktionen wie
NOW()
werden nicht als Argument von benutzerdefinierten Funktionen erlaubt . Der Versuch , do zu so Ergebnisse in der Fehlermeldung „Diese Funktion ist nicht erlaubt , eine Zelle mit verweisenNOW()
,RAND()
oderRANDBETWEEN()
“ .Funktionen in Google Apps Script sollen deterministisch sein. Da Ihre benutzerdefinierte Funktion keine Parameter hat, gibt sie jedes Mal das gleiche Ergebnis zurück.
Siehe Problem 2573: Math.random () wird nicht als benutzerdefinierte Tabellenkalkulationsformel neu berechnet
Um jedes Mal eine neue Zufallszahl zu erstellen, sollte der aktuelle Zeitstempel als Parameter übergeben werden:
Diese Funktion scheint jedoch niemals zurückzukehren. Ich vermute, das liegt daran, dass sich der Rückgabewert von
NOW()
jede Millisekunde ändert und die Berechnung mehr als eine Millisekunde dauert.Sie müssten sich also mit etwas zufrieden geben, das nicht so oft aktualisiert werden muss, wie z
Dies würde jeden Tag des Monats einen neuen Zufallswert zurückgeben.
Wenn Sie diese Formel in mehr als einer Zelle verwenden, wird für alle Zellen der gleiche Zufallswert zurückgegeben. Um dies zu vermeiden, können Sie auch die aktuellen Zellkoordinaten als Parameter übergeben:
Ich habe eine Beispieltabelle erstellt und kann sie mir gerne ansehen.
Anstatt neue Parameter einzuführen, haben Sie möglicherweise Glück , wenn Sie versuchen, die Einstellung unter Datei → Tabelleneinstellungen → Neuberechnung auf Bei Änderung und jede Minute zu ändern . Zumindest sollte dies funktionieren
RAND()
, siehe Dokumentation . Derzeit wird mir eine Fehlermeldung angezeigt, sodass ich nicht sehen kann, ob dies funktioniert.quelle
Zufallszahlen generieren Add-on kann helfen, Zufallszahlen in Google Spreed Sheet zu generieren
Für detaillierte Informationen klicken Sie hier
quelle