Google Apps Script でSpreadsheetをデータベース代わりにwebアプリをポチポチ作ってて、スクリプトからSpreadsheetにフィルタかける場合、同一カラムに複数条件を設定できないことを知って残念……。
フィルタのかけ方はこんな感じ。
日付を範囲指定したいけど、After、Before片方しかつけられない。
var dataFile = SpreadsheetApp.openById(DATA_FILE_ID); var sh = dataFile.getSheetByName(LOG_SHEET_NAME); var criteriaDateAfter = SpreadsheetApp.newFilterCriteria().whenDateAfter(new Date(targetDate)).build(); var criteriaUserEqual = SpreadsheetApp.newFilterCriteria().whenTextEqualTo(user.id).build(); if (sh.getFilter()) { sh.getFilter().remove(); } var r = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()) .createFilter() .setColumnFilterCriteria(DATE_COL, criteriaDateAfter) .setColumnFilterCriteria(USER_ID_COL, criteriaUserEqual) .getRange();
FilterCriteriaに2回条件設定してみたり
var criteriaDateRange = SpreadsheetApp.newFilterCriteria() .whenDateAfter(new Date(date1)) .whenDateBefore(new Date(date2)).build();
同じカラムに2回条件設定してみたり
var r = sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()) .createFilter() .setColumnFilterCriteria(DATE_COL, criteriaDateAfter) .setColumnFilterCriteria(DATE_COL, criteriaDateBefore) .setColumnFilterCriteria(USER_ID_COL, criteriaUserEqual) .getRange();どちらも後の条件のみ有効になる。
……で、やむをえず、データの日付カラムを重複させることにした。Afterでフィルタ用とBeforeでフィルタ用。ひどい。でも他の解決策あるっていうなら教えてください。
(getRange().getValues()の結果をforで見ながら絞り込むのとどっちがマシかって話)。
コメント
コメントを投稿