0

有人可以幫助使全局變量不再是全局的。函數checkDate()需要能夠訪問(var = formatteddate)。我無法將全局變量與函數checkDate()結合在一起,因爲它只是一遍又一遍地重複ui.prompt。如何將全局變量與函數結合起來?

有關腳本的一點背景知識,通過ui.prompt輸入日期,年份取自該日期,並以數字格式放置爲(var = formatteddate)。

功能了checkdate(),檢查該年(VAR = formatteddate)中的所有行柱7.

功能filterRows(),從了checkdate取信息並過濾行。

複製和刪除工作表的腳本只是我測試的一部分,所以在測試腳本之前我不需要總是複製我的數據。

如果您要測試腳本,請創建兩張表,「主日誌」和「主日誌副本」。在「主日誌」中,從第2行開始,在H列(第7列)中放置一些日期。理想情況下,2016年和2017年的日期。查看正在進行的過濾。 「主日誌副本」將在每次運行時刪除/創建。

我的理想解決方案是將GLOBAL行與函數checkDate()結合起來。

謝謝! =)

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

在我看來,'行[7] .getFullYear()=== formatteddate'是一個數字比較字符串,你確定這是正確的? – RobG

回答

0

在我看來,formatteddate(這是真的只是一個年)應該是filterRows一部分。不需要checkDate,因爲它似乎並不特別可重用。

考慮:

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 
    }); 

    ... 
}