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

    ... 
}