如何将Global变量与函数结合起来?

时间:2017-02-04 00:34:43

标签: javascript google-apps-script google-sheets google-spreadsheet-api

有人可以帮助使全局变量不再是全局变量。函数checkDate()需要能够访问(var = formatteddate)。我无法将全局变量与函数checkDate()结合使用,因为它只是一遍又一遍地重复ui.prompt。

脚本的一些背景,日期通过ui.prompt输入,年份从该日期开始,并以数字格式放置为(var = formatteddate)。

函数checkDate(),检查第7列中年份的所有行(var = formatteddate)。

函数filterRows(),从checkdate获取信息并过滤行。

复制和删除工作表的脚本只是我测试的一部分,所以在测试脚本之前我不需要总是复制我的数据。

如果您要测试脚本,请创建两张表,' Master Log'和'主日志副本'。在' Master Log'从第2行开始,将一些日期放在H列(第7列)下。理想情况下2016年和2017年的日期。要查看正在进行的过滤。 '主日志副本'将在每次运行时删除/创建。

我理想的解决方案是将GLOBAL行与Function 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); 
}

1 个答案:

答案 0 :(得分: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
  });

  ...
}