簡體   English   中英

UI提示反復在電子表格中彈出,如何使其僅彈出一次?

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

我不知道我錯過了什么,但ui.promptfunction checkDate(row)不斷彈出。 我只希望它彈出一次。 我認為問題是return (row[7].getFullYear() === formatteddate); 正在為每行重復檢索var formatteddate

腳本的一些背景知識,通過ui.prompt輸入日期,從該日期獲取年份,並以數字格式放置為var formatteddate

function checkDate(row) ,檢查第7列中year var formatteddate所有行。

function filterRows() ,從checkdate獲取信息並過濾行。

復制和刪除工作表的腳本只是我測試的一部分,因此在測試腳本之前,我不需要總是復制數據。 過時的一年也是我的測試/構建過程的一部分。

如果要測試腳本,請創建兩張紙,“主日志”和“主日志副本”。 在“主日志”中,從第2行開始,在H列(第7列)下放置一些日期。 理想情況是一些2016年和2017年的日期。 查看正在執行的過濾。 每次運行都會刪除/創建“主日志副本”。

如何在function checkDate(row)創建該分隔,以便通過return (row[7].getFullYear() === formatteddate);僅將一次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(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); 
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM