現在、社内で使うための**「Googleスプレッドシートで作る用語集アプリ」の作成**に取り組んでおります。
そして、その制作にピッタリなサイトも見つけました。(こちらです)
しかし、コピペをして再現しようとしたのですが上手くいかず、色々と試してはみたものの、改善には至りませんでした。
そこで皆様の知識をお借りさせていただけないでしょうか。
ご協力の程どうぞよろしくお願い致します。
また、質問の方法が違うなどのご指摘があれば修正致しますのでご容赦ください。
【達成目標】
参考サイトの動きを再現
【出てくるファイル・ページ】
・スプレッドシート(ファイル名:経営用語集、シート名:用語集)
・GAS(プロジェクト名:用語集、コード:search.gs)
・HTML(ファイル名:index(.html))
【問題点】
・参考サイトからファイル名やコードを真似て作成したスクリプトファイルにエラーが出てしまう。
・HTMLをウェブ上で表示した際に、UIが上手く表示されていない。
→どこが問題なのかを理解できていません....。
【これまで試したこと】
・openByIdをopenByUrlへ変更→エラー内容に変化無し
・エラー箇所発見のためにconsole.logの使用→ファイル上部には問題なし(?)
現状のコードとログは次の通りです。
JavaScript
1search = ""; 2var id ='16R5lcJWbXBezCW5cIoPz0rBS35lrtz9sMjYLm2wvn3Y'; 3var sheet = SpreadsheetApp.openById(id).getSheetByName("用語集"); 4 5console.log(sheet); //エラーチェック 6console.log(sheet.getName()) //エラーチェック 7 8function doPost(e){ 9 doGet(e); 10 return HtmlService.createTemplateFromFile("index").evaluate(); 11} 12function doGet(e) { 13 search = e.parameter.searchWord; 14 if (e.parameter.name == undefined) { 15 //初期表示はビューのみ 16 return HtmlService.createTemplateFromFile("index").evaluate(); 17 } 18 if (e.parameter.searchWord !== undefined) { 19 //検索時も同じ画面に返します 20 return HtmlService.createTemplateFromFile("index").evaluate(); 21 } 22} 23function getSearch(){ 24 return search; 25} 26
また、参考サイト内に登場する「index.html」と「スプレッドシート」、及びHTMLをウェブ上で開いた状態も以下に追加いたします。
ちなみに、HTML内で修正を行ったのは
html
1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 </head> 6 <body> 7 <style> 8*文字数の関係で内容省略 9 </style> 10 <div id='header-fixed'> 11 <form name="serchForm" action="https://docs.google.com/spreadsheets/d/16R5lcJWbXBezCW5cIoPz0rBS35lrtz9sMjYLm2wvn3Y/edit#gid=0/exec?name=search"> 12 <a id='menu' href="https://docs.google.com/spreadsheets/d/16R5lcJWbXBezCW5cIoPz0rBS35lrtz9sMjYLm2wvn3Y/edit#gid=0/exec">全件表示</a> 13 検索文字:<input type="text" width="30%" name="searchWord" required> 14 <input type="submit"> 15 <font size="1px"> 現在の時刻:<span id="clock_time"></span></font> 16 </form> 17<script> 18function clock() 19{ 20 // 現在日時を表すインスタンスを取得 21 *文字数の関係で内容省略 22} 23setInterval(clock, 1000); 24</script> 25 </div> 26 <div id='content'> 27 <ul> 28 <? 29 // シートから用語集を表示する 30 var id ='16R5lcJWbXBezCW5cIoPz0rBS35lrtz9sMjYLm2wvn3Y'; 31 var mySheet = SpreadsheetApp.openById(id).getSheetByName("用語集"); 32 var endrow = mySheet.getLastRow(); 33 var myData = mySheet.getRange(2, 1 , endrow-1 , 4).getValues(); 34 myMail = Session.getActiveUser().getEmail(); 35 search = getSearch(); 36 output.append('検索文字='+ escape_html(search)); 37 output.append('<table class="search" border="1">'); 38 output.append('<tr bgcolor="#aaccff"><th>カテゴリ</th><th>用語</th><th>内容</th></tr>'); 39 y=0; //検索結果のカウンタ 40 for(var i=0;i<myData.length;i++){ 41 category = myData[i][0]; 42 word = myData[i][1]; 43 content = myData[i][2]; 44 url = myData[i][3]; 45 if(search !== undefined){ 46 if (word.indexOf(search) !== -1){ 47 *文字数の関係で内容省略 48 } 49 }else{ 50 *文字数の関係で内容省略 51 } 52 } 53 output.append('</table>'); 54 if (y == 0){ 55 output.append('検索できませんでした。キーワードを変えてもう一度検索してください。'); 56 } 57 ?> 58 <? 59 function escape_html (string) { 60 if(typeof string !== 'string') { 61 return string; 62 } 63 return string.replace(/[&'`"<>]/g, function(match) { 64 return { 65 '&': '&', 66 "'": ''', 67 '`': '`', 68 '"': '"', 69 '<': '<', 70 '>': '>', 71 }[match] 72 }); 73 } 74 ?> 75 </ul> 76 </div> 77</body> 78</html>
お力添え頂ければ幸いです。
どうぞよろしくお願い致します。
★★★5/20更新★★★
お二人の方にアドバイスを頂き、完成へ近付いているという実感があります。
ありがとうございます。
しかし、依然としてエラーが出てしまっており、そちらの解決方法についてもご教授いただければ幸いです。
【行った修正】
・「プロジェクトの設定」から「Chrome V8 ランタイムを有効にする」チェックを外す。
・参考サイトのhtmlコードには余分な全角空白がいくつか混じっているので、取り除く。(不十分な部分があるかもしれません)
・<form ~> の action と #menuのhrefのURLへはデプロイしたウェブアプリのURLを入力
・form actionのurl中のnameパラメータをsearchからsearchWordへ変更
・検索語句が数字の場合にエラーが発生しないようにするため、検索語句を文字列に変換
前:word = myData[i][1]; → 後:word = String(myData[i][1]);
・一度デプロイして、デプロイIDをHTML側にコピーし、デプロイの管理から一番上のアクティブなデプロイを選び編集ボタンを押し、バージョンのセレクトボックスから新バージョンを選択し、「適切なコメント」を入力して再度デプロイ
→「適切なコメント」を正しく理解出来ていないかもしれませんが、ご記入いただいた手順の通り修正を行いました。
【現状発生しているエラー】
1,スクリプトファイル上で「parameter」が読み取れていない。
2,ウェブアプリのURLへ飛ぶと画面が字だらけになっている。
【現状のコード】
JavaScript
1search = ""; 2var id ='16R5lcJWbXBezCW5cIoPz0rBS35lrtz9sMjYLm2wvn3Y'; 3var sheet = SpreadsheetApp.openById(id).getSheetByName("用語集"); 4 5console.log(id); //エラーチェック 6console.log(sheet.getName()) //エラーチェック 7 8function doPost(e){ 9 doGet(e); 10 return HtmlService.createTemplateFromFile("index").evaluate(); 11} 12function doGet(e) { 13 search = e.parameter.searchWord; 14 if (e.parameter.name == undefined) { 15 //初期表示はビューのみ 16 //return HtmlService.createTemplateFromFile("index").evaluate(); 17 return HtmlService.createHtmlOutputFromFile("index") 18.setSandboxMode(HtmlService.SandboxMode.IFRAME); 19 } 20 if (e.parameter.searchWord !== undefined) { 21 //検索時も同じ画面に返します 22 return HtmlService.createTemplateFromFile("index").evaluate(); 23 } 24} 25function getSearch(){ 26 return search; 27} 28
html
1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 </head> 6 <body> 7 <style> 8 *文字数の関係で内容省略 9 </style> 10 <div id='header-fixed'> 11 <form name="serchForm" action="https://script.google.com/macros/s/AKfycbzQzvKu_mSPmUJoaLFem2fQ9CxItXJUF0PwFvpJD2NT6Sni2D8V6DHCZZi4uwQJycmh/exec?name=searchWord"> 12 <a id='menu' href="https://script.google.com/macros/s/AKfycbzQzvKu_mSPmUJoaLFem2fQ9CxItXJUF0PwFvpJD2NT6Sni2D8V6DHCZZi4uwQJycmh/exec">全件表示</a> 13 検索文字:<input type="text" width="30%" name="searchWord" required> 14 <input type="submit"> 15 <font size="1px"> 現在の時刻:<span id="clock_time"></span></font> 16 </form> 17<script> 18function clock() 19{ 20 *文字数の関係で内容省略 21} 22setInterval(clock, 1000); 23</script> 24 </div> 25 <div id='content'> 26 <ul> 27 <? 28 // シートから用語集を表示する 29 var id ='16R5lcJWbXBezCW5cIoPz0rBS35lrtz9sMjYLm2wvn3Y'; 30 var mySheet = SpreadsheetApp.openById(id).getSheetByName("用語集"); 31 var endrow = mySheet.getLastRow(); 32 var myData = mySheet.getRange(2, 1 , endrow-1 , 4).getValues(); 33 myMail = Session.getActiveUser().getEmail(); 34 search = getSearch(); 35 output.append('検索文字='+ escape_html(search)); 36 output.append('<table class="search" border="1">'); 37 output.append('<tr bgcolor="#aaccff"><th>カテゴリ</th><th>用語</th><th>内容</th></tr>'); 38 y=0; //検索結果のカウンタ 39 for(var i=0;i<myData.length;i++){ 40 category = myData[i][0]; 41 word = String(myData[i][1]) 42 content = myData[i][2]; 43 url = myData[i][3]; 44 if(search !== undefined){ 45 if (word.indexOf(search) !== -1){ 46 replace = word.replace(search, '<font color="#ff0000" size="2px"><b>'+ search +'</b></font>'); 47 output.append('<tr>'); 48 output.append('<td width="10%" valign="top"><font color="#000000" size="2px">'+ category +'</font></td>'); 49 output.append('<td width="20%" align="left" valign="top"><font size="2px">'+ replace +'</font></td>'); 50 output.append('<td valign="top"><font style="bold" size="2px" color="#000000">'+ content +'</font></td>'); 51 output.append('</tr>'); 52 y ++; 53 } 54 }else{ 55 output.append('<tr>'); 56 output.append('<td width="10%" valign="top"><font color="#000000" size="2px">'+ category +'</font></td>'); 57 output.append('<td width="20%" align="left" valign="top"><font color="#000000" size="2px">'+ word +'</font></td>'); 58 output.append('<td valign="top"><font style="bold" size="2px" color="#000000">'+ content +'</font></td>'); 59 output.append('</tr>'); 60 } 61 } 62 output.append('</table>'); 63 if (y == 0){ 64 output.append('検索できませんでした。キーワードを変えてもう一度検索してください。'); 65 } 66 ?> 67 <? 68 function escape_html (string) { 69 if(typeof string !== 'string') { 70 return string; 71 } 72 return string.replace(/[&'`"<>]/g, function(match) { 73 return { 74 '&':'&', 75 "'":''', 76 '`':'`', 77 '"':'"', 78 '<':'<', 79 '>':'>', 80 }[match] 81 }); 82 } 83 ?> 84 </ul> 85 </div> 86</body> 87</html>
」画面中が字で埋め尽くされる」エラーの内容から考えると初歩的なミスであるかもしれません。
申し訳ありませんが、再度お力添えの程よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/20 13:23
2021/05/20 13:28
2021/05/20 14:16