2017-02-08 8 views
0

元のシート「パスコ」のfunction checkDate(row)の(実際の)行だけの背景色を変更するにはどうすればよいですか?これは可能ですか?「真」の行のみ背景色を変更するにはどうすればよいですか?

スクリプトについて少し:

日付範囲がfunction getDateRange()を介して入力されるが、シート内のすべての行は、「パスコ」彼らはfunction checkDate(row)を通じてその日付の範囲を満たしている場合にチェックされます。日付範囲(true)を満たしていれば、function filterRows()は基本的に「パスコ」シートから行をフィルタリングし、別のシート「パスコのコピー」に移動します。

私の質問をするもう一つの方法は、 "Pasco"シートで "true"だったすべての行の範囲を取得する方法です。 「パスコ」が日付順にソートされなかった場合、これは複数の範囲を意味する可能性があります。一度私は範囲を持っていると、私は背景を簡単に変更することができるだろう。

スクリプトをテストする場合は、「パスコ」と「パスコのコピー」の2枚のシートを作成してください。 'パスコ'列2から出発して、いくつかの日付を列1(列8)に置きます。実際のフィルタリングを表示する。 'Copy of Pasco'は、実行ごとに削除/作成されます。

は、私はあなたのコードを読んで、あなたに完全な答えを与えるために時間を持っていませんが、あなただけのシートとのセットを通過するループを追加することができ

var globalStartDate; 
var globalEndDate; 

function getDateRange(){ 

    var startui = SpreadsheetApp.getUi(); 
    var startprompt = startui.prompt('Start Date', 'Enter a date in m/d/y format', startui.ButtonSet.OK_CANCEL); 
    var startdate = new Date(startprompt.getResponseText()); 
    var startdatemilliseconds = startdate.getTime(); 
    Logger.log(startdate); 
    Logger.log(startdatemilliseconds); 
    globalStartDate = startdatemilliseconds; 

    var endui = SpreadsheetApp.getUi(); 
    var endprompt = endui.prompt('End Date', 'Enter a date in m/d/y format', endui.ButtonSet.OK_CANCEL); 
    var enddate = new Date(endprompt.getResponseText()); 
    var enddatemilliseconds = enddate.getTime(); 
    Logger.log(enddate); 
    Logger.log(enddatemilliseconds); 
    globalEndDate = enddatemilliseconds; 
} 

function checkDate(row) { 

    Logger.log(row[8].getTime() <= globalEndDate && row[8].getTime() >= globalStartDate); 
    return (row[8].getTime() <= globalEndDate && row[8].getTime() >= globalStartDate); // Check column H 
} 

function filterRows() { 

    var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet1 = Spreadsheet.getSheetByName('Pasco'); 
    var sheetdelete = Spreadsheet.getSheetByName('Copy of Pasco'); 

    Spreadsheet.deleteSheet(sheetdelete); 
    Spreadsheet.setActiveSheet(sheet1); 
    Spreadsheet.duplicateActiveSheet(); 

    var headers = 1; // # rows to skip 
    var sheet2 = Spreadsheet.getSheetByName('Copy of Pasco'); 
    var range = sheet1.getDataRange(); 
    var data = range.getValues(); 
    var headerData = data.splice(0,headers); // Skip header rows 
    getDateRange(); 
    var filteredData = data.filter(checkDate); 
    var outputData = headerData.concat(filteredData); // Put headers back 
    Logger.log(filteredData) 

    sheet2.clearContents(); // Clear content, keep format 

    // Save filtered values 
    sheet2.getRange(1, 1, outputData.length, outputData[0].length).setValues(outputData); 
} 

答えて

1

申し訳ありませんが)=お時間をいただき、ありがとうございます各行の背景色は「true」です。私が「本当」と仮定の下に私のスクリプトで

が列Aにある

function myFunction() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var data = sheet.getRange(1, 1, sheet.getLastRow()).getValues(); 
    var lastCol = sheet.getMaxColumns(); 

    for (var i = 0; i < data.length; i ++){ 
    if(data[i][0] == true){ 
    sheet.getRange(i + 1, 1, 1, lastCol).setBackground('Yellow'); 
    } 
    } 
} 

EDIT

あなたは、フィルタ行機能にgetDateRange()を呼び出した後、このコードを挿入します。

var lastCol = sheet1.getMaxColumns(); 

    for(var i = headers; i < data.length ; i++){ 
    if(data[i][8].getTime() <= globalEndDate && data[i][8].getTime() >= globalStartDate){ 
    sheet1.getRange(i, 1, 1, lastCol).setBackground('Yellow'); 
    } 
    } 

あなたのフィルター行機能は次のようになります。

function filterRows() { 

    var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet1 = Spreadsheet.getSheetByName('Pasco'); 
    var sheetdelete = Spreadsheet.getSheetByName('Copy of Pasco'); 

    Spreadsheet.deleteSheet(sheetdelete); 
    Spreadsheet.setActiveSheet(sheet1); 
    Spreadsheet.duplicateActiveSheet(); 

    var headers = 1; // # rows to skip 
    var sheet2 = Spreadsheet.getSheetByName('Copy of Pasco'); 
    var range = sheet1.getDataRange(); 
    var data = range.getValues(); 
    var headerData = data.splice(0,headers); // Skip header rows 
    getDateRange(); 

    var lastCol = sheet1.getMaxColumns(); 
    for(var i = headers; i < data.length ; i++){ 
    if(data[i][8].getTime() <= globalEndDate && data[i][8].getTime() >= globalStartDate){ 
    sheet1.getRange(i + headers, 1, 1, lastCol).setBackground('Yellow'); 
    } 
    } 

    var filteredData = data.filter(checkDate); 
    var outputData = headerData.concat(filteredData); // Put headers back 
    Logger.log(filteredData) 

    sheet2.clearContents(); // Clear content, keep format 

    // Save filtered values 
    sheet2.getRange(1, 1, outputData.length, outputData[0].length).setValues(outputData); 
} 
+0

あなたができるかどうか、私は本当に、私はあなたの答えは私の問題を解決する可能性を秘めていると思いますが、あなたを介して読む時間があればいいのに後で、読んで、コードを微調整してください。 –

+0

上記を参照してください。これは必要なものですか? –

+0

私たちははるかに近いです!問題は、バックグラウンドを行でなくてはならない行、コードでIF文に失敗する行に変更していることです。私の1つのテストでは、実際にはヘッダー行(行1)も変更されました。チェックしなければならない日付は、第1列にあります。スクリプト全体をテストすることができたら、必要なシートを作成し、日付を入力してください。私は本当にあなたの助けに感謝します! =) –

関連する問題