2017-08-29 1 views
1

Ich habe zwei Probleme.Das Meldungsfeld wird nicht angezeigt, wenn es über das Menü ausgeführt wird. Diese Funktion ist auch langsam

1) Meine Funktion noDateAlert(); ist LANGSAM. Irgendwelche Vorschläge, um es weniger als 5 Sekunden zu machen? Momentan dauert es 17-30, abhängig davon, wie viele Zeilen es überprüft werden muss.

2) Die Fehlermeldung wird nicht angezeigt, wenn ich noDateAlert(); in einer anderen Funktion aus meinem benutzerdefinierten Menü ausführen. Es funktioniert gut, wenn ich es von der Skriptseite selbst ausführe. Es funktioniert auch gut, wenn es innerhalb des anderen Programms von der Skriptseite aus ausgeführt wird.

Ich benutze dieses Programm, um mich zu warnen, wenn die 3 Zellen leer sind.

Wenn es in der anderen Funktion eingeschlossen ist, ist es das erste Ding, das aufgeführt wird.

Hier ist die Funktion:

function noDateAlert() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sh0 = ss.getSheetByName("Loads"); 

    // get data from Loads sheet 
    var data = sh0.getRange(8,29,53,31).getValues(); 
    var data2 = sh0.getRange(8,3,53,3).getValues(); 


    for(var i=0; i < 45; i++) { //Controls how many rows it goes through for posting // len = data.length; i < len 

    //Only work on loads currently wanting to post 
    if(data2[i][0] == "P-Post"){ 

    //Warn me if all 3 cells in one row are empty/blank 
    if(data[i][0] == "" && data[i][1] == "" && data[i][2] == ""){ 
      Browser.msgBox("Some of the loads you want to post are missing dates. Please check dates and run 'Post Loads' again."); 
      return false; 
      break; 
     }; 
     }; 
    }; 
}; 
+0

Warum erhält 'data2' 3 Spalten mit Daten? Der gezeigte Code erhält nur Daten vom Index Null. Sie können das in 1 Spalte von Daten ändern, wenn das alles ist, was Sie brauchen. –

+0

Nein Ich brauche alle 3 Spalten. Ich habe 3 Spaltendaten, also kann ich bis 3 Daten einfügen. Wenn sie alle leer sind, brauche ich eine Warnung. Wenn es einen Weg gibt, alle 3 als ein Objekt zu betrachten, das helfen könnte. – Clayten

Antwort

0

Versuchen Sie dies für Ihre msgbox. Und ich werde weiter auf das andere Problem schauen.

Ich bin nicht in Ihre Daten eingeweiht, aber ich bezweifle, dass ich die Dinge auf diese Weise tun. Aber da Sie Zugriff auf Ihre Daten haben und davon Kenntnis haben, gehe ich davon aus, dass eine Aufteilung in zwei Bereiche sinnvoll ist. Ich hoffe jedoch, dass Sie wissen, dass data2 [i] [0] tatsächlich Spalte 3 ist und data [i] [0] tatsächlich Spalte 29. Ich habe die Grenze für i bei 53 verlassen, da Sie in beiden Bereichen 53 Zeilen angegeben haben. Aber wieder. Ich kenne die Details nicht und habe auch keinen Zugriff auf die Daten. Wenn das nicht hilft, können Sie es zurück ändern.

function noDateAlert() 
{ 
    var ss=SpreadsheetApp.getActiveSpreadsheet(); 
    var sh0=ss.getSheetByName("Loads"); 
    var data = sh0.getRange(8,29,53,31).getValues(); 
    var data2 = sh0.getRange(8,3,53,3).getValues(); 
    for(var i=0;i<53;i++) 
    { 
     if(data2[i][0]=="P-Post") 
     { 
     if(!data[i][0] && !data[i][1] && !data[i][2]) 
     { 
      SpreadsheetApp.getUi().alert('Some of the loads you want to post are missing dates. Please check dates and run \'Post Loads\' again.'); 
      return false; 
     } 
     } 
    } 
} 
+0

Ich habe es als 4 && Segmente versucht und es funktioniert etwa genauso wie es in zwei if-Anweisungen aufzuteilen. Wenn es kein P-Post gibt, gibt es keinen Sinn, die anderen 3 Spalten zu überprüfen. Ich werde überprüfen, was Sie haben und sehen, wie es die Dinge verbessert. Danke! – Clayten

+0

Ich habe es in zwei Bereiche aufgeteilt, weil es viele Daten im Blatt gibt und ich möchte nicht, dass jedes Mal alle Daten gesammelt werden müssen. Ich brauche nur Spalte C und Spalten AC: AE. – Clayten

+0

Also habe ich versucht, SpreadsheetApp.getUi(). Alert ('Einige der Lasten, die Sie buchen möchten, fehlen Daten. Bitte überprüfen Sie Termine und führen Sie \' Loads \ 'erneut.'); Ich bekomme das gleiche Problem wie zuvor. Wenn ich es manuell vom Skript-Editor aus starte, funktioniert es. Wenn ich es als zeitgesteuerter Auslöser oder innerhalb eines Programms ausführe, tut es das nicht. – Clayten

Verwandte Themen