2016-08-23 4 views
0

Ich habe ein Formular erstellt, das alle Felddaten in ein Google-Formular einfügt, und ich habe ein Skript, das die Tabelle bei jeder Bearbeitung der Tabelle in eine CSV-Datei exportiert. Das Skript wird jedoch nur ausgeführt, wenn das Blatt geöffnet ist und auf dem Blatt bearbeitet wird. Wenn ich mein Formular absende, das das Tabellenblatt bearbeitet, wird der Auslöser nicht ausgelöst und der CSV wird nicht erstellt.Google App Script CSV exportieren onEdit, nicht onOpen

Unter meinem aktuellen Projekt Auslöser habe ich meine Veranstaltung oneedit laufen.

Wie kann ich meine Trigger auslösen, wenn das Blatt nicht geöffnet ist?

function onOpen() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var entries = [{ 
    name : "Download Data", 
    functionName : "saveAsCSV" 
    }]; 
    sheet.addMenu("Script Center Menu", entries); 
}; 

function saveAsCSV() { 
    // Trash the previous csv file that was last updated. 
var files = DriveApp.getFilesByName('myCSVFile.csv'); 
while (files.hasNext()) { 
    var file = files.next(); 
    if (file.getLastUpdated()) { 
    file.setTrashed(true); 
    } 
} 
    // Creates the file name 
    var fileName = ("myCSVFile"); 
    // Check that the file name entered wasn't empty 
    if (fileName.length !== 0) { 
    // Add the ".csv" extension to the file name 
    fileName = fileName + ".csv"; 
    // Convert the range data to CSV format 
    var csvFile = convertRangeToCsvFile_(fileName); 
    // Create a file in the Docs List with the given name and the CSV data 
    DriveApp.createFile(fileName, csvFile); 
    } 
    else { 
    Browser.msgBox("Error: Please enter a CSV file name."); 
    } 
} 

function convertRangeToCsvFile_(csvFileName) { 
    try { 
    var csvFile = undefined; 

    var sheet = SpreadsheetApp.getActiveSheet(); 
    var rows = sheet.getDataRange(); 
    var numRows = rows.getNumRows(); 
    var data = rows.getValues(); 

    // Loop through the data in the range and build a string with the CSV data 
    if (data.length > 1) { 
     var csv = ""; 
     for (var row = 0; row < data.length; row++) { 
     for (var col = 0; col < data[row].length; col++) { 
      if (data[row][col].toString().indexOf(",") != -1) { 
      data[row][col] = "\"" + data[row][col] + "\""; 
      } 
     } 

     // Join each row's columns 
     // Add a carriage return to end of each row, except for the last one 
     if (row < data.length-1) { 
      csv += data[row].join(",") + "\r\n"; 
     } 
     else { 
      csv += data[row]; 
     } 
     } 
     csvFile = csv; 
    } 
    return csvFile; 
    } 
    catch(err) { 
    Logger.log(err); 
    Browser.msgBox(err); 
    } 
} 
+0

Versuchen Sie, die Funktion für 'onFormSubmit()' Trigger – iJay

+0

zu schreiben Wird das funktionieren, auch wenn es ein externes Formular ist? Kein Google-Formular? – cgrouge

+0

Ich werde versuchen, ändern 'var sheet = SpreadsheetApp.getActiveSpreadsheet();' für openById – Harold

Antwort

0

Nachdem ich Hilfe von den Kommentaren oben bekommen habe und meine Trigger angepasst habe, habe ich eine Lösung. Hier

ist das Skript:

function onEdit() { 
    var sheet = SpreadsheetApp.openById("id"); 
    var entries = [{ 
    name : "Download Data", 
    functionName : "saveAsCSV" 
    }]; 
    sheet.addMenu("Script Center Menu", entries); 
}; 

function saveAsCSV() { 
    // Trash the previous csv file that was last updated. 
var files = DriveApp.getFilesByName('myCSVFile.csv'); 
while (files.hasNext()) { 
    var file = files.next(); 
    if (file.getLastUpdated()) { 
    file.setTrashed(true); 
    } 
} 
    // Creates the file name 
    var fileName = ("myCSVFile"); 
    // Check that the file name entered wasn't empty 
    if (fileName.length !== 0) { 
    // Add the ".csv" extension to the file name 
    fileName = fileName + ".csv"; 
    // Convert the range data to CSV format 
    var csvFile = convertRangeToCsvFile_(fileName); 
    // Create a file in the Docs List with the given name and the CSV data 
    DriveApp.createFile(fileName, csvFile); 
    } 
    else { 
    Browser.msgBox("Error: Please enter a CSV file name."); 
    } 
} 

function convertRangeToCsvFile_(csvFileName) { 
    try { 
    var csvFile = undefined; 

    var sheet = SpreadsheetApp.getActiveSheet(); 
    var rows = sheet.getDataRange(); 
    var numRows = rows.getNumRows(); 
    var data = rows.getValues(); 

    // Loop through the data in the range and build a string with the CSV data 
    if (data.length > 1) { 
     var csv = ""; 
     for (var row = 0; row < data.length; row++) { 
     for (var col = 0; col < data[row].length; col++) { 
      if (data[row][col].toString().indexOf(",") != -1) { 
      data[row][col] = "\"" + data[row][col] + "\""; 
      } 
     } 

     // Join each row's columns 
     // Add a carriage return to end of each row, except for the last one 
     if (row < data.length-1) { 
      csv += data[row].join(",") + "\r\n"; 
     } 
     else { 
      csv += data[row]; 
     } 
     } 
     csvFile = csv; 
    } 
    return csvFile; 
    } 
    catch(err) { 
    Logger.log(err); 
    Browser.msgBox(err); 
    } 
} 

Nach dem Speichern der Skriptdatei ich brauchte, um meine Trigger von onEdit zu einem zeitlichen Trigger zu ändern. Ressourcen> all Ihre Trigger Ich habe die aktuelle saveAsCSV-Funktion gelöscht und eine neue erstellt. Dann ausgewählte zeitgesteuerte, Minuten-Timer, jede Minute.

Jetzt, wenn das Blatt geschlossen ist, wird die Funktion ausgeführt und erstellt jede Minute eine neue CSV-Datei.

Verwandte Themen