0

誰かがグローバル変数をグローバルにしないように助けてください。関数checkDate()は(var = formatteddate)にアクセスできる必要があります。私はグローバル変数を関数checkDate()と組み合わせることができません。なぜなら、ui.promptを何度も何度も何度も繰り返し続けているからです。グローバル変数と関数を結合する方法は?

スクリプトの背景が少ししかないので、日付はui.promptを介して入力され、年はその日付から取得され、数値形式で(var = formatteddate)として配置されます。

機能checkDate()、年間のすべての行をチェックします(VAR = formatteddate)列目の7

機能filterRows()、checkdateから情報を取得し、行をフィルタリングします。

シートを複製して削除するスクリプトは私のテストの一部です。そのため、スクリプトをテストする前に必ずデータを複製する必要はありません。

スクリプトをテストする場合は、「マスターログ」と「マスターログのコピー」という2枚のシートを作成してください。 '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); 
} 
+0

は私には思える '行[7] .getFullYearは()formatteddate'は、数値を文字列に比較している===、あなたは確信していることは正しいのか? – RobG

答えて

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 
    }); 

    ... 
} 
関連する問題