UI 电子表格提示重复弹出,如何让它只弹出一次?

UI Prompt repeatedly popping up in spreadsheet, how can I make it pop up only once?

我不确定我遗漏了什么,但是 function checkDate(row) 中的 ui.prompt 不断弹出。我只希望它弹出一次。我认为问题在于,return (row[7].getFullYear() === formatteddate); 正在为每一行重复检索 var formatteddate

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

function checkDate(row),检查第 7 列中年份 var formatteddate 的所有行。

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

复制和删除 sheet 的脚本只是我测试的一部分,所以我不需要总是在测试脚本之前复制我的数据。让年份过时也只是我 testing/building 过程的一部分。

如果要测试脚本,请创建两个 sheet,'Master Log' 和 'Copy of Master Log'。在 'Master Log' 中,从第 2 行开始,将一些日期放在 H 列(第 7 列)下方。理想情况下是 2016 年和 2017 年的一些日期。查看过滤效果。 'Copy of Master Log' 将是 deleted/created 每个 运行.

如何在 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); 
    }

Array.fliter(函数) 为数组的每个元素调用函数。 因此,在您的代码中,函数 checkDate 是从数据的每个元素(或 sheet 中的每一行)调用的。

以下修改后的代码要求用户输入一次过滤条件并使用相同的条件更新全局变量。因此,您的函数 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); 
    }