毎年3月第一土曜日に全世界で開催されている、オープンデータデイ 。
今年も掛川で「オープンデータデイ2022 in 掛川」を、コードフォー掛川のメンバー中心に開催しました。
今年の取り組みは ~地域の音をデータ化して世界に公開しよう~ 。
文章や、画像、動画に関心が集まる中、音に着目し地域の音のデータベース化ができないか、という企画です。
そのためにデータを収集する仕組み、公開する仕組み作りに携わったので、ほかの地域でも活用できるよう、覚書を残しておきたいと思います。
入力とデータベース
不特定多数の方にデータを入力してもらって、それを保存する方法はいくつもあります。
ただ、今回は誰でも簡単に構築できる方法を取りたかったので、GoogleフォームとGoogleスプレッドシートを使うことにしました。
なぜなら、この組み合わせだったら多少ネットに詳しい方ならできるということと、大体無料で使えるからです。
Googleのアカウントを作って、Googleフォーム を開いて、フォームを作ります。
今回のフォームでは、
記述式
- メールアドレス
- 場所
- 緯度経度
ラジオボタン
- 時間帯
朝 昼 夕方 夜
段落
- 説明
ファイルアップロード
- 音声
特定のファイル形式のみ許可 音声
ファイルの最大数 1
最大ファイルサイズ 10 MB
- 画像
特定のファイル形式のみ許可 画像
ファイルの最大数 1
最大ファイルサイズ 10 MB
フォームができたら回答されたデータを、スプレッドシートに転記する設定をします。
「回答」タグを開いて、スプレッドシートのアイコン(緑に白十字のもの)をクリック。
「回答先の選択」で「新しいスプレッドシートを作成」します。
そうすると回答をまとめるスプレッドシートが出来上がるので、右上の「目」のアイコン(プレビュー)から、テスト回答をしてみます。
Googleフォームに戻って、回答タグの スプレッドシート を開くと、テスト回答がスプレッドシートに入っているます。
このデータを外部ツール等を使って公開します。
Googleフォームの注意点
このように、Googleフォームを使うことで、ユーザー参加型のデータベースを簡単に作ることができますが、いくつか注意点があります。
一つ目は、ファイルのアップロードを使用する場合、投稿者もGoogleアカウントでログインする必要があります。
セキュリティの問題だと思いますが、不特定多数の参加が見込まれる場合は、あらかじめGoogleアカウントの作成と、現地でログインできるような準備をしておくことをアナウンスしておいた方がいいでしょう。
2つ目はファイルアップロードでアップロードされたファイル名には、投稿者のGoogleaアカウント名が挿入されてしまいます。
aaa.jpg をアップロードすると aaa – ユーザー名.jpg というファイル名で、Googleドライブ内に保存、表示・ダウンロードの際、そのファイル名が使用されます。
Googleのサービスを積極的に使っている方なら、あまり気にしないかもしれませんが、そうでない方も投稿する可能性があれば、そのあたりの注意喚起もしておいた方が良いかと思います。
ただ、ファイル名に関しては、Google Apps Scriptで一括リネームができるので、適宜リネームをするといいかもしれません。
参照
GoogleDriveの新規作成で、 Google Apps Script を選択。
音声ファイルのリネームは、以下のコードを張り付けてメニューから実行ボタンをクリック
function myFunction() {
// 変換対象のファイルが入っているフォルダをIDで指定
const folder = DriveApp.getFolderById('フォルダID');
// ファイル一覧を取得(イテレータが得られる)
const files = folder.getFiles();
// 次に処理可能なファイルがあるか確認し、あれば1つずつ処理
while (files.hasNext()) {
// ファイル名を確認
const file = files.next();
const currentFileName = String(file.getName());
// 文字列置換を使ってファイル名の一部だけを置き換える
// 正規表現置換を使ってファイル名の一部だけを置き換える
const regex = /^(.*) - .*\.m(.*)$/i;
const newFileName = currentFileName.replace(regex, '$1' + ".m" + '$2')
// ファイル名を再設定する(リネーム)
file.setName(newFileName);
// 確認のためコンソール表示
console.log(newFileName);
}
}
画像ファイル用はこちら。
function myFunction() {
// 変換対象のファイルが入っているフォルダをIDで指定
const folder = DriveApp.getFolderById('フォルダID');
// ファイル一覧を取得(イテレータが得られる)
const files = folder.getFiles();
// 次に処理可能なファイルがあるか確認し、あれば1つずつ処理
while (files.hasNext()) {
// ファイル名を確認
const file = files.next();
const currentFileName = String(file.getName());
// 文字列置換を使ってファイル名の一部だけを置き換える
// 正規表現置換を使ってファイル名の一部だけを置き換える
const regex = /^(.*) - .*\.jp(.*)$/i;
const newFileName = currentFileName.replace(regex, '$1' + ".jp" + '$2')
// ファイル名を再設定する(リネーム)
file.setName(newFileName);
// 確認のためコンソール表示
console.log(newFileName);
}
}
今回のイベント中に突貫で作ったコードなので、もう少しスマートにできるかもしれませんが、こうしたらいいよとかあったら、教えてください。