GAS x HtmlでWebアプリを作ってみよう④ 検索機能の実装
さて、いよいよ今回は、YouTube検索Webアプリの心臓部分である機能を実装していきます。
とは言っても、基本部分は、スプレッドシートアプリ(Webサイトから情報を取得する⑤ Web API vol.2)として作ったコードを利用できますので、効率的です。
では、やっていきましょう!
getVideoInfos関数をそのまま利用
getVideoInfos関数は、何にもいじらずそのまま利用できます。

function getVideoInfos(id) {
const results = YouTube.Videos.list('statistics', {
id: id
});
const viewCount = results.items[0].statistics.viewCount;
const likeCount = results.items[0].statistics.likeCount;
return [viewCount, likeCount];
}
searchByKeyword関数をWebアプリ用にカスタマイズ
searchByKeyword関数は、Webアプリ用に一部カスタマイズが必要です。
スプレッドシートからの検索ワードの取得が不要なので、その部分を削除します。

function searchByKeyword(query) {
try {
const results = YouTube.Search.list('id,snippet', {
q: query,
maxResults: 25,
type: 'video',
});
if (results === null) {
console.log('Unable to search videos');
return;
}
const data = [];
results.items.forEach(item => {
const url = 'https://www.youtube.com/watch?v=';
const id = item.id.videoId;
const rowData = [item.snippet.title, url + id];
const [viewCount, likeCount] = getVideoInfos(id);
rowData.push(viewCount, likeCount);
data.push(rowData);
});
return data;
} catch (err) {
// TODO (developer) - Handle exceptions from Youtube API
console.log('Failed with an error %s', err.message);
}
}
doPost関数に追記
コード.gsファイルに記述したdoPost関数にオレンジ枠の2行を追記します。
e.parameter.queryで検索ワードが取得できることは、シリーズ③で確認しました。
検索ワードを変数queryに格納し、searchByKeyword関数の引数として渡します。
そして、その戻り値を変数dataに格納します。

function doGet() {
const template = HtmlService.createTemplateFromFile('index');
template.deployUrl = ScriptApp.getService().getUrl();
const htmlOutput = template.evaluate();
return htmlOutput;
}
function doPost(e) {
const query = e.parameter.query;
const data = searchByKeyword(query);
const template = HtmlService.createTemplateFromFile('result');
template.deployUrl = ScriptApp.getService().getUrl();
const htmlOutput = template.evaluate();
return htmlOutput;
}
dataの中身を確認してみよう
では一旦、console.log(data);として、dataが正しく取得できているかどうか確かめてみましょう。
1. ファイルを保存
2. 新しくデプロイし、アプリのURLをクリック
3. 入力ページで「大谷翔平」と入力し、検索をクリック
4. スクリプトに戻り「実行数」から最新のdoPostを開く

問題ないようです。
dataが取得できています。
動画のタイトル、URL、再生数、いいね数が25件、二次元配列で格納されています。

dataを検索結果ページに書き出そう
いよいよ、検索機能の最終段階です。
取得したdataを検索結果ページに書き出すことができれば、ほぼ完成ですね。
やり方としては、result.htmlファイルに表形式でdataを書き出しますので、<table>タグを使います。
中身の<tr><td>タグは同じパターンで繰り返すので、for文でループします。
これらの処理をgetTableHtml関数を作成して行います。
今回、Webアプリ用の関数として全く新しく作るのはこの関数だけです。
getTableHtml関数を作成
テンプレートリテラルを使います。

function getTableHtml(data) {
let html = `<table border="1">`;
html += `<tr><th>No</th><th>タイトル</th><th>Link</th><th>再生数</th><th>いいね</th></tr>`;
for (let i = 0; i < data.length; i++) {
const [title, url, viewCount, likeCount] = data[i].flat();
html += `<tr>`;
html += `<td>${i+1}</td>`;
html += `<td>${title}</td>`;
html += `<td><a href="${url}" target="_blank" rel="noopener noreferrer">Link</a></td>`;
html += `<td>${viewCount}</td>`;
html += `<td>${likeCount}</td>`;
html += `</tr>`;
}
html += `</table>`;
return html;
}
doPost関数に追記
doPost関数に次の1行を追記します。
template.tableHtml = getTableHtml(data);
これで、変数tableHtml をresult.htmlで利用可能になります。

result.htmlに追記
result.htmlに次の1行を追記します。
<? output._ = tableHtml ?>
実装完了です!
試してみましょう。
1. ファイルを保存
2. 新しくデプロイし、アプリのURLをクリック
3. 入力ページで「大谷翔平」と入力し、検索をクリック

検索結果ページに書き出し成功です!

Homeボタンを設置
検索結果ページの下にHomeボタンがあると便利ですね。
ワンクリックで入力画面に戻れます。
設置しましょう。

result.htmlに次の1行を追記します。
<p id="uni"><a href="<?!= deployUrl ?>" class="btn">Home</a></p>
<?!= ?>スクリプトレットタグで変数の呼び出しが可能です。
<p>タグにuniというid属性、<a>タグにbtnというclass属性を付けたので、それらを作っていきます。

css.htmlにオレンジ枠の内容を追記します。
追記したら、
1. ファイルを保存
2. 新しくデプロイし、アプリのURLをクリック
3. 入力ページで「大谷翔平」と入力し、検索をクリック
でテストしてみましょう。

<style>
.container {
max-width: 1000px;
margin: auto;
padding: 10px 30px 50px;
background-color: #f5f5f5;
}
.btn {
border-radius: 5px;
background-color: blue;
padding: 10px;
text-decoration: none;
color: white;
transition: all .2s;
}
.btn:hover {
background-color: #f5f5f5;
color: blue;
border: 1px solid blue;
}
#uni {
margin-top: 50px;
}
</style>
結果ページのタイトル頭に検索ワードを付ける
下図のように、検索結果ページのタイトル頭に検索ワードを入れましょう。
変数queryをスクリプトレットタグで呼び出せばできそうですね。

コード.gsのdoPost関数に次の1行を追記します。
template.query = query;
GASのHtmlサービスの独特の記法ですね。
こう書くんだと覚えてしまいましょう。
これで変数queryを呼び出せます。

result.htmlの<h1>タグに下図のように追記します。
<h1>“<?!= query ?>"の検索結果</h1>
追記したら、
1. ファイルを保存
2. 新しくデプロイし、アプリのURLをクリック
3. 入力ページで「大谷翔平」と入力し、検索をクリック
でテストしてみましょう。
お疲れ様でした
