2017-12-18 6 views
0

Ich habe ein gut funktionierendes Skript zum Kopieren von Zellen gemacht * OnEdit (col16 auf Blatt 2) wenn eine Zeile in Col16 = "Ja") zur letzten Zeile der benutzerdefinierten Spalte auf Blatt (jetzt Col4). Aber ich habe eine Abfrage basierte Daten auf Blatt , so kopiert mein Skript Daten nur, wenn ich "Ja" von Hand eingeben. Aus diesem Grund muss ich dieses Skript jetzt per Knopfdruck oder als zeitgesteuerten Auslöser ausführen. Kann es nicht per Knopfdruck zur Arbeit bringen. Wie ändere ich das folgende Skript, um durch Klicken auf die Schaltfläche arbeiten zu können?Wie OnEdit-Skript in Run-by-Button-Skript (kopieren Sie Zellen von 1 Blatt zu einem anderen mit Regel)

function onEdit(e) { 
    var ss = SpreadsheetApp.getActive(); 
    var sheet = ss.getActiveSheet(); 
if (sheet.getName() !== '2' || e.range.getColumn() !== 16 || e.value !== 'Yes') return; 
    var value = e.range.offset(0,-12,1,1).getValue(); 
    sheet = e.source.getSheetByName('1'); 
    var grd = sheet.getRange("D:D").getValues(); 
    var maxIndex = grd.reduce(function(maxIndex, row, index) { 
    return row[0] === "" ? maxIndex : index; 
    }, 0); 
    sheet.getRange(maxIndex+2,e.range.getColumn()-12,1,1).setValue(value); 
} 

UPDATE: Ich habe versucht, mein Skript so zu verändern, zu Taste zugewiesen und nach Knopf- es „Running ..... dann Finished ...“ sagen zu klicken, aber es Kopieren Sie nichts (aber es funktioniert, wenn OnEdit (e) ist, und ich bekomme keinen Fehler. Aber es scheint, es ist nicht genug, ändern Sie einfach "OnEdit (e)" zu "copymissings()", ich muss ändern etwas im Code, aber ich weiß nicht, was genau Bitte helfen.

function copymissings() { 
    var s = SpreadsheetApp.getActive(); 
    if (s.getName() !== '2' || range.getColumn() !== 16 || value !== 'Yes') return; 
    var value = range.offset(0,-12,1,1).getValues(); 
    sht = s.getSheetByName('1'); 
    var grd = sheet.getRange("D:D").getValues(); 
    var maxIndex = grd.reduce(function(maxIndex, row, index) { 
    return row[0] === "" ? maxIndex : index; 
    }, 0); 
    sht.getRange(maxIndex+2,range.getColumn()-12,1,1).setValues(value); 
} 

Visualisierung: CLICK TO SEE GIF

+0

Mögliches Duplikat [Wie Sie UI innerhalb von Zellen in einer Google-Tabelle mit App-Skript fügen Sie?] (Https://stackoverflow.com/questions/6876819/how-do-you-add-ui-inside -cells-in-a-google-tabelle-using-app-script) –

+0

Was meinst du damit, dass es nicht durch Knopfdruck ausgeführt werden kann? Was hast du probiert? Haben Sie eine Fehlermeldung erhalten? –

+0

Hallo, ich habe meinen Beitrag aktualisiert – Stz

Antwort

0

Okay, großen Dank an Edward Ulle von "Plus" Google Apps Skript-Forum.

Wir haben funktionierende Version des gleichen Skripts wie ich in der Post angeboten, die automatisch OnEdit funktioniert.

Das folgende Skript kopiert Zellen aus Sheet-2 Col4, wenn diese Zeile "Yes" in Col16 zu Sheet-1 Col4 enthält. Alles optional.

function copymissings() { 
    try { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    // Source sheet 
    var shs = ss.getSheetByName("2"); 
    // Values from Sheet2 
    var vs = shs.getRange(1,1,shs.getLastRow(),shs.getLastColumn()).getValues(); 
    // Destination sheet 
    var shd = ss.getSheetByName("1"); 
    // Get the destination range 
    var rd = shd.getRange("D:D"); 
    // Gets a 2D array 
    var vd = rd.getValues(); 
    var j = 1; 
    // Get offset j to first empty row 
    for(j=0; j<vd.length; j++) { 
     if(vd[j][0] == 0) break; 
    } 
    // Assuming you want to do for every row in Sheet2 
    for(var i=0; i<vs.length; i++) { 
     if(vs[i][15] == "Yes") { // Column 16 is index 15 
     // Use offset from last row of destination sheet 
     rd.offset(j,0,1,1).setValue(vs[i][3]); // Copy to column 4 (0) 
     j++; // Increment to next row 
     } 
    } 
    } 
    catch(err) { 
    Logger.log(err); 
    } 
} 
0

Ich denke, Sie mischen hier zwei Konzepte. onEdit() ist ein Trigger, der AUTOMATISCH ausgeführt wird, wenn ein Benutzer den Wert einer Zelle ändert. Was Sie jedoch versuchen, ist MANUAL, da der Benutzer verantwortlich ist, wann das Ereignis ausgelöst wird.

Informationen zum Erstellen von UI-Schaltflächen finden Sie unter HTML Service: Create and Serve HTML. Sie können die tatsächlichen Proben here überprüfen.

+0

Sry, aber nicht das, was ich erwartet habe. Beantwortet von mir selbst – Stz

Verwandte Themen