スプレッドシートをデータベースとして利用しWEBアプリケーションを作っています。
データを保持しているスプレッドシートをWEBアプリケーションからキーワード検索(部分一致)を行なって検索結果をHTMLに表示すると言う処理を作りました。
しかし、検索時に下記のような処理(データベースのスプレッドシートからquery関数を利用し、別のスプレッドシートに一時的に表示し、取得する処理)で結果を取得しているのですが、まれに対象件数が10件あるのに、1件しか取得できない場合があります。
原因としては、複数人が同時に使用した場合、結果を一時的に表示するスプレッドシートに何枚もシートを作成され、全てのシートがimpoertrange関数を使用しているため、結果取得に時間がかかってしまっていると思います。
私の勉強不足で、スピレッドシートをデータベースとして使用す場合の検索の仕方がこの方法か、for~ if~を使用し、1件ずつ確認する方法しか思いつかないのですが、何か別の方法はありますでしょうか?
よろしくお願いします。
記載しているコードは、検索の部分のみ抜粋しています。
JavaScript
1 2function getdata(sql){ 3 //例:sql => "SELECT * WHERE Col2 LIKE '%xxx%'" 4 5 //query関数を貼り付けるスプレッドシート 6 var query_sheet = SpreadsheetApp.openById("[query関数を貼り付けるシートID]"); 7 8 //アカウントを取得 9 var user_id = Session.getActiveUser().getEmail(); 10 11 //セルに貼り付ける関数を作成 12 var setfx = '=query(IMPORTRANGE("[データベースのシートID]","[シート名]!A:Z"),' + sql + ')' ; 13 14 //[ユーザアカウント]のシートがあるかチェック。 なければ、[null] 15 var mySheetchk = query_sheet.getSheetByName(user_id); 16 17 //シートがあった場合、既存のシートを削除 18 if(mySheetchk != null){ 19 query_sheet.deleteSheet(mySheetchk); 20 } 21 22 //[ユーザアカウント]のシートを作成し、関数を[A1]に貼り付け 23 var srcSheet = query_sheet.insertSheet(user_id); 24 srcSheet.getRange(1, 1).setValue(setfx); 25 26 //結果をの最終行を取得し、全てオブジェクト型で取得 27 var lastRow = srcSheet.getLastRow(); 28 var lastCol = srcSheet.getLastColumn(); 29 var result_Array = srcSheet.getRange(1,1,lastRow,lastCol).getValues(); 30 31 //[ユーザアカウント]のシートを削除 32 query_sheet.deleteSheet(srcSheet); 33 34 return result_Array; 35}
回答1件
あなたの回答
tips
プレビュー