Google Spreadsheet generiert Zufallszahlen mit Math.random ()

7

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:

Zufallszahl

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:

Zufallszahl 2

Gibt es eine Möglichkeit, innerhalb einer Funktion eine aktualisierbare Zufallszahl zu generieren?

Yang
quelle
Können Sie einfach die Ergebnisse von = rand () in eine Hilfsspalte einfügen und dann den Inhalt dieser Spalte an Ihre Funktion übergeben? Dies kann das angehängte Hängeverhalten beheben.
MaryC.fromNZ

Antworten:

3

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().

var reference = 'A1';

Funktion onEdit (e) {
  SpreadsheetApp
    .getActiveSheet ()
    .getRange (Referenz)
    .setValue (Math.random ());
}}

Verweise

Rubén
quelle
2

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 verweisen NOW(), RAND()oder RANDBETWEEN() .


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:

 =f(now())

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

=f(day(now()))

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:

=f(day(now()), 2, 4)

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.

Vidar S. Ramdal
quelle
2

Zufallszahlen generieren Add-on kann helfen, Zufallszahlen in Google Spreed Sheet zu generieren

Geben Sie hier die Bildbeschreibung ein

Für detaillierte Informationen klicken Sie hier

Vembu
quelle