0

Könnte jemand bitte helfen, die globalen Variablen nicht mehr global zu machen. Auf die Funktion checkDate() muss zugegriffen werden können (var = formatdate). Ich bin nicht in der Lage, die globalen Variablen mit Function checkDate() zu kombinieren, da es immer wieder wiederholt das ui.prompt wiederholt.Wie kombiniert man die globalen Variablen mit einer Funktion?

Ein kleiner Hintergrund über das Skript, ein Datum wird über ein ui.prompt eingegeben, das Jahr wird von diesem Datum übernommen und als (var = formatiertes Datum) im Zahlenformat abgelegt.

Funktion checkdate() prüft alle Zeilen für das Jahr (var = formatteddate) in Spalte 7

Funktion filterRows(), die Informationen aus nimmt und filtert checkdate die Zeilen.

Das Skript, das das Blatt dupliziert und löscht, ist nur ein Teil meiner Tests, daher muss ich meine Daten vor dem Testen des Skripts nicht immer duplizieren.

Wenn Sie das Skript testen möchten, erstellen Sie bitte zwei Blätter, "Master Log" und "Kopie des Master Logs". In 'Master Log' Ab Zeile 2 legen Sie einige Daten in Spalte H (Spalte 7) ab. Idealerweise 2016 und 2017 Termine. Um die Filterung in Aktion zu sehen. 'Kopie des Master-Logs' wird bei jedem Lauf gelöscht/erstellt.

Meine ideale Lösung wäre, die GLOBAL-Zeilen mit der Funktion checkDate() zu kombinieren.

Vielen Dank! =)

var ui = SpreadsheetApp.getUi(); 
var prompt = ui.prompt('Start Date', 'Enter a date in m/d/y format', ui.ButtonSet.OK_CANCEL); 
var date = new Date(prompt.getResponseText()); 
var formatteddate = Number(Utilities.formatDate(date, "PST", "yyyy")); 
Logger.log(date); 
Logger.log(formatteddate); 

function checkDate(row) { 

    return (row[7].getFullYear() === formatteddate); // Check column B 
    Logger.log(row[7].getFullYear() === formatteddate) 
    } 

function filterRows() { 

    var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet1 = Spreadsheet.getSheetByName('Copy of Master Log'); 
    var sheet2 = Spreadsheet.getSheetByName('Master Log'); 

    Spreadsheet.deleteSheet(sheet1); 
    Spreadsheet.setActiveSheet(sheet2); 
    Spreadsheet.duplicateActiveSheet(); 

    var headers = 1; // # rows to skip 
    var sheet = Spreadsheet.getSheetByName('Copy of Master Log'); 
    var data = sheet.getDataRange().getValues(); 
    var headerData = data.splice(0,headers); // Skip header rows 
    var filteredData = data.filter(checkDate); 
    var outputData = headerData.concat(filteredData); // Put headers back 
    Logger.log(filteredData) 

    sheet.clearContents(); // Clear content, keep format 

    // Save filtered values 
    sheet.getRange(1, 1, outputData.length, outputData[0].length).setValues(outputData); 
} 
+0

Scheint mir 'row [7] .getFullYear() === formatteddate' eine Zahl in eine Zeichenfolge zu vergleichen, sind Sie sicher, das ist richtig? – RobG

Antwort

0

Mir scheint, dass formatteddate (das sollte wirklich nur ein Jahr ist) Teil filterRows sein. Es gibt keine Notwendigkeit für checkDate, da es nicht besonders wiederverwendbar scheint.

Bedenken Sie:

function filterRows() { 

    // Do the prompt when necessary 
    var prompt = ui.prompt('Start Date', 'Enter a date in m/d/y format', ui.ButtonSet.OK_CANCEL); 
    // Don't convert to Date, just get the year 
    var year = prompt.getResponseText().split(/\//)[2]; 

    ... 

    // Do comparison, use function expression 
    var filteredData = data.filter(function(row) { 
    return row[7].getFullYear() == year; // Allow compare string to number 
    }); 

    ... 
} 
Verwandte Themen