Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.93 KB | None | 0 0
  1. function doGet(e) {
  2. var sheetId = "1uULVU6VYBifYqbSJ9e4-r5hXyeX1NXwyO1tJbdxneqY";
  3. var ss = SpreadsheetApp.getActiveSpreadsheet();
  4. var sheetName = e["parameter"]["type"] || "books";
  5. var sheet = ss.getSheetByName(sheetName);
  6. var limit = 50; // デフォルトの検索表示件数
  7.  
  8. if(sheetName == "books") {
  9. var titles = ["作品ID","作品名","作品名読み","ソート用読み","副題","副題読み","原題","初出","分類番号","文字遣い種別","作品著作権フラグ","公開日","最終更新日","図書カードURL","人物ID","姓","名","姓読み","名読み","姓読みソート用","名読みソート用","姓ローマ字","名ローマ字","役割フラグ","生年月日","没年月日","人物著作権フラグ","底本名1","底本出版社名1","底本初版発行年1","入力に使用した版1","校正に使用した版1","底本の親本名1","底本の親本出版社名1","底本の親本初版発行年1","底本名2","底本出版社名2","底本初版発行年2","入力に使用した版2","校正に使用した版2","底本の親本名2","底本の親本出版社名2","底本の親本初版発行年2","入力者","校正者","テキストファイルURL","テキストファイル最終更新日","テキストファイル符号化方式","テキストファイル文字集合","テキストファイル修正回数","XHTML/HTMLファイルURL","XHTML/HTMLファイル最終更新日","XHTML/HTMLファイル符号化方式","XHTML/HTMLファイル文字集合","XHTML/HTMLファイル修正回数","文字数","書き出し","累計アクセス数","カテゴリ"]
  10. var numRows = 16600;
  11. } else {
  12. var titles = ["人物ID","姓名","姓","名","姓読み","名読み","姓読みソート用","名読みソート用","姓ローマ字","名ローマ字","生年月日","没年月日","人物著作権フラグ"]
  13. var numRows = 1105;
  14. }
  15. // カラム数から最終カラムのA1Notationを計算
  16. var numColumns = titles.length;
  17. var digitTwo = (quotient = Math.floor(numColumns/26) ) ? String.fromCharCode(96 + quotient) : "";
  18. var numColumnsChar = digitTwo + String.fromCharCode(96 + numColumns%26);
  19.  
  20. // parseしたクエリを順番に実行して、検索結果をmergeする
  21. var noQueryFlg = true;
  22. var matchRowNums = [];
  23. for(key in e["parameter"]) {
  24. var query = e["parameter"][key];
  25. var searchColumnNum = titles.indexOf(key) + 1; // 検索対象列の列番号取得
  26. if(searchColumnNum==0) { continue }; // 見出し行に含まれないクエリは無視
  27. noQueryFlg = false;
  28.  
  29. // [正規表現] 検索条件が//で囲まれてる場合は正規表現検索
  30. var regexMatch = e["parameter"][key].match(/\/(.*)\//);
  31. if(regexMatch) { query = regexMatch[1]; }
  32.  
  33. // [完全一致] 検索条件が""で囲まれてる場合は完全一致検索
  34. var entireMatch = e["parameter"][key].match(/"(.*)"/);
  35. if(entireMatch) { query = entireMatch[1]; }
  36.  
  37. // 検索実行: マッチしたセルが返ってくるので、row番号を配列に格納しておく
  38. var textFinder = sheet.getRange(2,searchColumnNum,numRows,1).createTextFinder(query).useRegularExpression(Boolean(regexMatch)).matchEntireCell(Boolean(entireMatch));
  39. var rowNums = textFinder.findAll().map(function(v){ return v.getRowIndex(); });
  40.  
  41. // 前回までの条件でヒットしてるrowNumsとの積集合を取得(AND検索)
  42. matchRowNums = (matchRowNums.length == 0) ? rowNums : matchRowNums.filter(function(m){ return rowNums.indexOf(m) >= 0 });
  43. }
  44.  
  45. // ページング
  46. if(!isNaN(e["parameter"]["limit"])) { limit = Math.min(limit, e["parameter"]["limit"]); }
  47. var offset = (isNaN(e["parameter"]["offset"])) ? 0 : Number(e["parameter"]["offset"]);
  48. var totalCount = noQueryFlg ? numRows : matchRowNums.length; // 検索の総ヒット件数
  49. matchRowNums = matchRowNums.slice(offset, offset + limit);
  50. if(noQueryFlg) {
  51. var startRow = offset + 2; //offsetが0スタートなので+1, 見出し行をスキップでさらに+1
  52. for(var i=startRow; i<(startRow+limit); i++) { matchRowNums.push(i); } // 検索クエリがないときは、[0..50]みたいにそのまま上から順番に取得
  53. }
  54.  
  55. // rangeListからまとめてデータ取得
  56. var ranges = matchRowNums.map(function(m){ return sheetName + "!A" + m + ":" + numColumnsChar + m; });
  57. var valueRanges = (ranges.length > 0) ? Sheets.Spreadsheets.Values.batchGet(sheetId, {ranges: ranges})["valueRanges"] : [];
  58.  
  59. // 検索結果を整形してレスポンス作成
  60. var responseData = { items: [], totalCount: totalCount };
  61. for(var i=0; i<valueRanges.length; i++) {
  62. // 行データを見出し付きhashに整形
  63. var row = valueRanges[i]["values"][0];
  64. var json = {}
  65. for(var j=0; j<numColumns; j++) {
  66. Logger.log(j);
  67. Logger.log(titles[j]);
  68. Logger.log(row[j]);
  69. json[titles[j]] = row[j];
  70. }
  71. responseData["items"].push(json);
  72. };
  73. return ContentService.createTextOutput(JSON.stringify(responseData));
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement