我不确定我错过了什么,但ui.prompt
中的function checkDate(row)
不断出现。我只希望它弹出一次。我认为问题在于,return (row[7].getFullYear() === formatteddate);
是否为每一行重复检索var formatteddate
。
脚本背景,日期通过ui.prompt
输入,年份从该日期开始,并以数字格式var formatteddate
放置。
function checkDate(row)
,检查第7列中var formatteddate
年的所有行。
function filterRows()
,从checkdate获取信息并过滤行。
复制和删除工作表的脚本只是我测试的一部分,因此我不需要在测试脚本之前始终复制我的数据。把这一年过时也只是我测试/建设过程的一部分。
如果您要测试脚本,请创建两张表,' Master Log'和'主日志副本'。在' Master Log'从第2行开始,将一些日期放在H列(第7列)下。理想情况下2016年和2017年的日期。要查看正在进行的过滤。 '主日志副本'将在每次运行时删除/创建。
如何在function checkDate(row)
中创建该分隔,以便var formatteddate
只检索一次return (row[7].getFullYear() === formatteddate);
?
谢谢! =)
function checkDate(row) {
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);
return (row[7].getFullYear() === formatteddate); // Check column H
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 :(得分:0)
Array.fliter(function)为数组的每个元素调用该函数。 因此,在您的代码中,函数checkDate是从数据的每个元素(或工作表中的每一行)调用的。
以下修改过的代码要求用户输入一次过滤条件,并使用相同的更新全局变量。因此,您的函数checkDate可以访问所述变量,而不会为每一行调用用户提示。
PS:没有执行return语句之后的任何事情,所以你的日志在checkDate(row)函数的return语句之后没有被执行。这让你相信这个
return (row[7].getFullYear() === globalFormattedDate);
是您代码中的罪魁祸首。
var globalFormattedDate //global declaration of the variable
function getFilterDate(){
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);
globalFormattedDate = fomatteddate // setting your global variable value
}
function checkDate(row) {
Logger.log(row[7].getFullYear() === globalFormattedDate) // Moved from after the return statement
return (row[7].getFullYear() === globalFormattedDate); // Check column H
// Anything here wont be excuted return is the last line of excute in a function.
}
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
getFilterDate() // This sets the globalFormattedDate to be used by checkdate
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);
}