Google Apps Script

LowRider01

Cadet 1st Year
Registriert
Nov. 2022
Beiträge
9
Hallo zusammen,

ich habe folgenden Code. Der Code funktioniert auch soweit via Script. Ich möchte den Code jetzt so umschreiben, das die Daten in eine neue Google Tabelle via Script übertragen wird. Ich weiß leider nicht weiter. Ich weiß wohl, das die neue Tabelle per Link eingefügt werden muss und ebenfalls der Zugriff frei gegeben werden muss. Leider bekomme ich es nicht hin .

Vielleicht kann mir ja jemand helfe? Vielen Dank

Code:
function buchen() {
 
 
  var lock = LockService.getScriptLock();
  if (lock.tryLock(10000)) { // Wait for 1s
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet()
 
  var sheetDaten = activeSpreadsheet.getActiveSheet()
  var sheetEinnahmen = activeSpreadsheet.getSheetByName("Einnahmen")

  var row = 1
  while(sheetEinnahmen.getRange(row,1).getValue() != ""){
    row++
  }
 

  sheetEinnahmen.getRange(row,1).setValue(row-1)  // Position
  sheetEinnahmen.getRange(row,2).setValue(new Date()) // Datum
  sheetEinnahmen.getRange(row,3).setValue(sheetDaten.getRange("H3:J3").getValue()) //  Name
  sheetEinnahmen.getRange(row,4).setValue(sheetDaten.getRange("F27").getValue()) // Rabatt%
  sheetEinnahmen.getRange(row,5).setValue(sheetDaten.getRange("G27").getValue()) // Summe Rabatt
  sheetEinnahmen.getRange(row,6).setValue(sheetDaten.getRange("G30:J32").getValue()) // Gesamt
 
  lock.releaseLock()

  sheetDaten.getRange("B8").setValue("none")
  sheetDaten.getRange("B9").setValue("FALSE")
  sheetDaten.getRange("D8:D19").setValue("FALSE")
  sheetDaten.getRange("F8:F14").setValue("FALSE")
  sheetDaten.getRange("H8:H12").setValue("FALSE") //
  sheetDaten.getRange("J8:J11").setValue("none")
  sheetDaten.getRange("J12").setValue("FALSE")
  sheetDaten.getRange("L8").setValue("none")
  sheetDaten.getRange("L9").setValue("FALSE")
  sheetDaten.getRange("L10").setValue("FALSE")
  sheetDaten.getRange("L11").setValue("FALSE")
  sheetDaten.getRange("L12").setValue("FALSE")
  sheetDaten.getRange("L13").setValue("FALSE")
  sheetDaten.getRange("N8:N13").setValue("FALSE")
  sheetDaten.getRange("P8").setValue("FALSE")
  sheetDaten.getRange("P9").setValue("FALSE")
  sheetDaten.getRange("E25").setValue("FALSE")
  sheetDaten.getRange("E27").setValue("FALSE")
  sheetDaten.getRange("D31:E32").setValue("none")
 

SpreadsheetApp.getActive().toast("Summe gebucht!!")

}
}
 
Hi,
probier es mal hiermit:
Code:
function schreibeDatenInEinAnderesSheet() {
  let targetSs = SpreadsheetApp.openByUrl('https://url.to-some-other-spreadsheet');
  let targetSh = targetSs.getSheetByName('targetSheetName');
  targetSh.getRange('A2').setValue('Hallo Welt');
  targetSh.getRange(2,2,3,3).setValues([[1,2,3],[4,5,6],[7,8,9]]);
}

Es wird davon abgeraten viele Aufrufe auf die APIs zu machen, wie du es hier tust:
Code:
  var row = 1
  while(sheetEinnahmen.getRange(row,1).getValue() != ""){
    row++
  }

Du könntest das mit weniger Aufrufen lösen indem du z.B. abrufst, was die letzte Zeile deines Sheets ist, und dann die Spalte bis zur letzten Zeile abrufst und dann die Daten verarbeitest.
Code:
let lastRow = sheetEinnahmen.getLastRow();
let data = sheetEinnahmen.getRange(1, 1, lastRow-1, 1); // enthält die gesamte Spalte
for (let i in data) {
  let row = data[i];
  if (row[0] == '')  {
    // do something with it
  }
}

(So ungefähr sollte es gehen. Habs nicht ausprobiert.)
 
Zuletzt bearbeitet:
Hi,

vielen Dank für deine Antwort. Ich werde es später bzw morgen mal ausprobieren. Werde dann nochmal Rückmeldung geben.

Schönen Abend
 
Moin,

ich habe deinen Tipp jetzt ausprobiert. Es kommt eine Fehlermeldung bei mir. Vielleicht habe ich es auch nicht richtig umgesetzt.

Code:
function schreibeDatenInEinAnderesSheet() {


  let sheetxy = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0/');
  let sheetxxx = sheetxy.getSheetByName('Einnahmen');
  sheetxxx.getRange('A2').setValue('Test123');
  sheetxxx.getRange(2,2,3,3).setValues([[1,2,3],[4,5,6],[7,8,9]]);



let lastRow = sheetxy.getLastRow();
let data = sheetxy.getRange(1, 1, lastRow-1, 1); // enthält die gesamte Spalte
for (let i in data) {
  let row = data[i];
  if (row[0] == '')  {
 
  }
}



  sheetxy.getRange(row,1).setValue(row-1)  // Position
  sheetxy.getRange(row,2).setValue(new Date()) // Datum
  sheetxy.getRange(row,3).setValue(sheetxxx.getRange("H3:J3").getValue()) //  Name
  sheetxy.getRange(row,4).setValue(sheetxxx.getRange("F27").getValue()) // Rabatt%
  sheetxy.getRange(row,5).setValue(sheetxxx.getRange("G27").getValue()) // Summe Rabatt
  sheetxy.getRange(row,6).setValue(sheetxxx.getRange("G30:J32").getValue()) // Gesamt
 
  lock.releaseLock()

  sheetxxx.getRange("B8").setValue("none")
  sheetxxx.getRange("B9").setValue("FALSE")
  sheetxxx.getRange("D8:D19").setValue("FALSE")
  sheetxxx.getRange("F8:F14").setValue("FALSE")
  sheetxxx.getRange("H8:H12").setValue("FALSE") //
  sheetxxx.getRange("J8:J11").setValue("none")
  sheetxxx.getRange("J12").setValue("FALSE")
  sheetxxx.getRange("L8").setValue("none")
  sheetxxx.getRange("L9").setValue("FALSE")
  sheetxxx.getRange("L10").setValue("FALSE")
  sheetxxx.getRange("L11").setValue("FALSE")
  sheetxxx.getRange("L12").setValue("FALSE")
  sheetxxx.getRange("L13").setValue("FALSE")
  sheetxxx.getRange("N8:N13").setValue("FALSE")
  sheetxxx.getRange("P8").setValue("FALSE")
  sheetxxx.getRange("P9").setValue("FALSE")
  sheetxxx.getRange("E25").setValue("FALSE")
  sheetxxx.getRange("E27").setValue("FALSE")
  sheetxxx.getRange("D31:E32").setValue("none")
 

SpreadsheetApp.getActive().toast("Summe gebucht!!")


}


Hier einmal der Code .

Screenshot_104.png

Und hier einmal die Fehlermeldung.


Danke
 
LowRider01 schrieb:
sheetxxx.getRange('A2').setValue('Test123');
LowRider01 schrieb:
sheetxxx.getRange(2,2,3,3).setValues([[1,2,3],[4,5,6],[7,8,9]]);
Nochmal eine Ergänzung, die beiden Werte werden in die neue Tabelle übertragen. Trotz Fehlermeldung.

Bekomme es nur nicht hin, das die eigentlichen Werte übertragen werden.
 
Hi,
erst einmal: das mit der Fehlermeldung ist merkwürdig, aber sowas passiert schon mal.
Hab schon so einige derartige Meldungen gesehen, die sich später von allein erledigt haben.

Ich glaube es würde dir helfen dich erstmal mit gewissen Grundsätzen der Programmierung vertraut zu machen.
Die Nomenklatur die du nun deinen Variablen gegeben hast (sheetxxx & sheetxy) ich nicht sonderlich selbst erklärend und kann dir auf Dauer das Leben schwer machen.

Ich habe in meinem Beispiel die Namen wie folgt zusammengebaut:
targetSs:
target ist das englische Wort für Ziel. Weil deine Daten aus der Quelle ins Ziel übertragen werden.
Ss weil die Funktion openByUrl() ein Spreadsheet-Objekt zurück gibt.

targetSh weil die Funktion getSheetByName() ein Sheet-Objekt zurück gibt.

LowRider01 schrieb:
Bekomme es nur nicht hin, das die eigentlichen Werte übertragen werden.
Warum nicht?
Was hast du probiert?
Was ist dabei passiert oder nicht passiert?

Kleiner Tipp noch am Rande:
Die Dokumentation ist dein bester Freund:
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app

Gruß
 
HeavensBlade schrieb:
Hi,
erst einmal: das mit der Fehlermeldung ist merkwürdig, aber sowas passiert schon mal.
Hab schon so einige derartige Meldungen gesehen, die sich später von allein erledigt haben.
Alles klar, das ist eine gute Info. Im Grunde funktioniert das Script.
HeavensBlade schrieb:
Die Nomenklatur die du nun deinen Variablen gegeben hast (sheetxxx & sheetxy) ich nicht sonderlich selbst erklärend und kann dir auf Dauer das Leben schwer machen.
Das hatte ich nur kurz für mich verändert. Das kann ignoriert werden. Ich hatte es nur nicht zurück gesetzt.
HeavensBlade schrieb:
Warum nicht?
Was hast du probiert?
Was ist dabei passiert oder nicht passiert?
Wenn ich das Script jetzt ausführe, werden deine Daten in die neue Tabelle übertragen.
sheetxxx.getRange('A2').setValue('Test123');
sheetxxx.getRange(2,2,3,3).setValues([[1,2,3],[4,5,6],[7,8,9]]);
Mein Ziel ist es diese Daten in die neue Tabelle zu übertragen. Und da scheitert es.

sheetxy.getRange(row,1).setValue(row-1) // Position
sheetxy.getRange(row,2).setValue(new Date()) // Datum
sheetxy.getRange(row,3).setValue(sheetxxx.getRange("H3:J3").getValue()) // Name
sheetxy.getRange(row,4).setValue(sheetxxx.getRange("F27").getValue()) // Rabatt%
sheetxy.getRange(row,5).setValue(sheetxxx.getRange("G27").getValue()) // Summe Rabatt
sheetxy.getRange(row,6).setValue(sheetxxx.getRange("G30:J32").getValue()) // Gesamt

Es ist "nur" ein Hobbyprojekt von einem Kumpel und mir. Diese Tabelle dient als Hilfe für ein Spiel. Da es mich aber doch sehr Interessiert, sitz ich da ziemlich energisch dran um es umgesetzt zu bekommen.



Gruß
 
LowRider01 schrieb:
sheetxy.getRange(row,1).setValue(row-1) // Position sheetxy.getRange(row,2).setValue(new Date()) // Datum sheetxy.getRange(row,3).setValue(sheetxxx.getRange("H3:J3").getValue()) // Name sheetxy.getRange(row,4).setValue(sheetxxx.getRange("F27").getValue()) // Rabatt% sheetxy.getRange(row,5).setValue(sheetxxx.getRange("G27").getValue()) // Summe Rabatt sheetxy.getRange(row,6).setValue(sheetxxx.getRange("G30:J32").getValue()) // Gesamt

Ich würde dringend empfehlen diesen Block hier etwas zu entzerren.
Hier kann zum Beispiel EVA (Eingabe, Verabeitung, Ausgabe) helfen.
Code:
// Eingabe (Daten einlesen)
var datum = new Date();
var name = sheetxxx.getRange("H3:J3").getValue();
var rabattProzent = sheetxxx.getRange("F27").getValue();
var rabattSumme = sheetxxx.getRange("G27").getValue();
var gesamt = sheetxxx.getRange("G30:J32").getValue();

// Verabeitung
// entfällt hier, weil die Daten ja nicht berechnet oder umgewandelt werden.

// Ausgabe (Daten schreiben)
sheetxy.getRange(row,1).setValue(row-1);
sheetxy.getRange(row,2).setValue(datum);
sheetxy.getRange(row,3).setValue(name);
sheetxy.getRange(row,4).setValue(rabattProzent);
sheetxy.getRange(row,5).setValue(rabattSumme);
sheetxy.getRange(row,6).setValue(gesamt);

Ich hatte dir ursprünglich mal das hier geschickt:
Code:
for (let i in data) {
  let row = data[i];
  if (row[0] == '')  {
    // do something with it
  }
}

Scheinbar ist dir der Kommentar "do something with it" abhanden gekommen.
Probier das mal so:
Code:
var rowNumber = 0;
for (let i in data) {
  let row = data[i];
  if (row[0] == '')  {
    rowNumber = i;
    break;
  }
}
 
Ich danke dir auf jeden Fall schon mal. Ich probiere morgen nochmal mein Glück. Und gebe Rückmeldung
 
Zurück
Oben