![](/img/trans.png)
[英]How do I make so the window.prompt variables only pop up when a button is clicked?
[英]UI Prompt repeatedly popping up in spreadsheet, how can I make it pop up only once?
我不知道我錯過了什么,但ui.prompt
的function 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.