見出し画像

【TR】無料で使えるクラウド(GAS)に自動で動画・データ保存(コピペで作れる/V8対応)

※ この記事はAndroidアプリ「トリレコ -TriggeRecord」で自動録画・録音されたデータおよびスマホの各種センサー値をGASに保存させるための方法を記載しています。

● "Intent"(インテント)機能を使って 他アプリでデータを送る
遠隔型赤外線センサーを500円にDIYしてスマホでリアル通知
● 自動・遠隔からYouTube配信を行う場合はコチラ

トリレコ -TriggeRecord」とは電源やWIFI環境がなくても なるべく長い時間、監視・モニターを行うためのAndroidアプリ。必要に応じて録画・録音し、データをクラウドにアップしたり、カメラ映像のAI解析や各種センサー値を記録します。格安SIMなどの低速なネット回線でも極力リアルタイム性を損なわず運用できるよう設計されています。

https://play.google.com/store/apps/details?id=com.Renkul.TriggeRecord

準備編

1)PC (機種問わず。スマホでもできなくないけど かなり面倒)
2)Googleアカウント(Gmail アカウントあればソレでOK)
3)やる気!(コピペでほぼ完成だけど)

ファイルを準備

1)Google Drive ドライブにアクセス して フォルダを作る。

今回 何も考えずに「webm」というフォルダを作った。(フォルダ名は変えてOK)

2)フォルダを開いて 2つのファイルを作る。ファイル名は自由だけど、あとで説明がややこしくなるといけないので 今回は同じ名前を推奨。

① フォルダの何もないところで右クリックで「Googleスプレッドシート」 →  ファイルが開いたら 左上で「rec file」というファイル名にし、次に左下の「シート1」というタブの名前を「001」に変更しておく。
※ 要領がわかれば のちに名称変更してOK。

自動保存だけど、改行で保存されるみたい。変更はこの赤○、2箇所のみ

② フォルダに戻り、「rec file」ができていることを確認。
もう1ファイルを作るため、右クリック → その他 → 「Google Apps Script」を選択。
左上の「無題のプロジェクト」→ 「base64Data」に変更。
次に左側のタブ内にある「コード.gs」→ 「main.gs」に変更

「無題のプロジェクト」→ 「base64Data」/ 「コード.gs」→ 「main.gs」

変更が完了したら「」ボタンを押す。
☑「「appsscript.json」マニフェスト ファイルをエディタで表示する」にチェックが入れて、左側のタブ  「< >」で戻る。

戻ったら「appscript.json」ってファイルができているので、下記のコードをコピペで上書きしてね。Gmail、Sheets、Driveへのアクセスを許可させるための呪文。※ 必要なものだけ追記してもOK。

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": []
  },
  "webapp": {
    "executeAs": "USER_DEPLOYING",
    "access": "ANYONE_ANONYMOUS"
  },
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.send_mail",
    "https://www.googleapis.com/auth/gmail.modify",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/drive.readonly",
    "https://www.googleapis.com/auth/drive"
  ],
  "runtimeVersion": "V8"
}

結果は下記のとおり。

最後の大仕事!といってもコピペでOK
main.gs」に 本体のコードをコピペする。ただこっちはファイル名(IDなど)少し変更する必要があるので慎重に。

シメでも使う画像

では本題のコードをコピペする。(下記サンプルコードあり)
そして「2箇所」自分の環境にあわせて変更する。
① 2行目の 「var ss = Spread*heetApp.openById("1UhJP8mB_CUGUwBrZSbWYdVi2W6BwDNd960z8Y******");」
というところ。
この値を調べるため Driveに戻って 「rec file」を開く→ URLをみる(ブラウザ側)と
「https://drive.google.com/drive/folders/1GivBXKuKPYjoDllCAgZtxByYE******」となっていると思う。
.….com/drive/folders/「*****この部分**** 」をコピーしてサンプルコードと置き換える。

→  Spread*heetApp.openById("*****この部分****"); となるようにする。
※ 「"」での閉じは必要だよ。また余分なスペースが入ると あとでナキを見ることに…

② 22行目「var folderId = '1GivBXKuKPYjoDllCAgZtxByYE4*******';」という箇所。
準備編 1)Google Drive で最初に作ったフォルダ…「rec file」「base64Dta」が入っているフォルダに戻り、そこのURLを見る。(ブラウザ側)
「https://drive.google.com/drive/folders/1GivBXKuKPYjoDllCAgZtxByYE***」となっていると思う。
これの  …com/drive/folders/「***この部分***」をコピーして置き換える。
もし下のようにhttps://drive.google.com/drive/folders/1GivBXKuKPYjoDllCAgZtxByYE4******?usp=drive_link
こんな感じで「?」が入っていれば、[?] の前までがID,必要な部分。

// サンプルコード sample code
var ss = Spread*heetApp.openById("1UhJP8mB_CUGUwBrZSbWYdVi2W6BwDNd960z8Y******"); // スプレッドシートのIDを指定します
var sheet = ss.getSheetByName("001"); // データを追加するシート名を指定します

function doPost(e) { 
  var inData = JSON.parse(e.postData.contents);
 var lock = LockService.getScriptLock();
 try { //lock用
    lock.waitLock(30000); // ロックを取得しようとする最大時間(ミリ秒)
  // データURIを抽出
  var fileName = inData.DATA1;
  var dataUri = inData.DATA2;
  var bt_tem = inData.DATA3.replace(/(.+%)(.+)/,'$1');
  var address = inData.DATA3.replace(/(.+%)(.+)/,'$2');
console.log(fileName,dataUri,bt_tem,address)
  sheet.insertRowBefore(1); // 先頭行にカラ行挿入
   sheet.getRange("A1").setValue(fileName); 
   sheet.getRange("B1").setValue(bt_tem); 

  if (dataUri.length>300) {
    // フォルダのIDを設定
    var folderId = '1GivBXKuKPYjoDllCAgZtxByYE4******';
    var folder = DriveApp.getFolderById(folderId);
    var mimeType='video/webm';
     const blob = Utilities.newBlob(Utilities.base64Decode(dataUri.substr(dataUri.indexOf('base64,')+7)), mimeType).setName(fileName);

     // Googleドライブにファイルを保存
     var file = folder.createFile(blob);
     file.setName(fileName+'.webm');
     // ドライブのURLを追記
     sheet.getRange("C1").setValue(file.getUrl());  

    // メール送信
    if(address.length>5){
      var options = { noReply: true };
      //var address=' //var subject=bt_tem; //var body=file.getUrl(); 
      GmailApp.sendEmail(address,fileName+bt_tem,file.getUrl(),options);
     }
     // ロック解除し 成功時のレスポンス
     lock.releaseLock();
     return ContentService.createTextOutput('保存完了:[🎬有] '+file.getUrl());      
  } else {//inData なし  
   sheet.getRange("C1").setValue(dataUri);  
   // メール送信
    if(address.length>5){
      var options = { noReply: true };
      //var address=' //var subject=bt_tem; //var body=file.getUrl(); 
      GmailApp.sendEmail(address,dataUri,fileName+bt_tem,options);
     }
    // データが提供されなかった場合のレスポンス
    lock.releaseLock();
    return ContentService.createTextOutput("保存完了");
  }
 } catch (e) {console.log('Err ',e);
    // エラーハンドリング
    return ContentService.createTextOutput("保存結果"+e);
 } finally {
   // ロックを解放
   lock.releaseLock();
 }
}

シメ!(最後の儀式)

ここまでできたら99%完成! あとはシメておく。
1つ前の画像(「シメでも使う画像」)を見ると、右上の青いボタンデプロイ」がある。
要するにWEB上に「公開」して、ネット上でアクセスできるようにするボタン。そう、全世界に公開されるんだけど、誰でもアクセスできる状態になるため、くれぐれも 今から出力される「長いURL」を 必要な人以外に教えないこと!
といっても公開されるのはデータはSheetに記載される値くらいなんだけど。(録画・録音データはDriveにあるため別途アクセス権が必要となる)

上のような感じにする。
説明は任意(入れなくてOK)、種類を「ウェブアプリ」として設定し、アクセスできるユーザーをセキュリティと矛盾するようだけど、「全員」とする。
これは、アプリ「トリレコ」には自分のGoogleアカウント権限がなく、一般ユーザーとして認識されるため「全員」とする必要がある。
そして右下の「デプロイ」を押す。

すると初回は下記にように 「アクセスを承認」と出る。承認しなければ次に進めないので する。あとは流れで、アカウント選択、承認する権限を選択してOK。 これでGAS(サーバー)側の準備は完了!

完成したGASサーバーのURLをトリレコ側に入力する必要がある。
最初にもURLが出てくるが、再度確認したいときは、右上の「デプロイ」ボタンで「デプロイを管理」を選択。下記の画面になるので、下の「ウェブアプリ」のほうのURLをコピーすればOK

トラブル回避のため このURLは関係者以外には教えないように!

最後にアプリ側へ取得したURLをペースト

アプリ「トリレコ」側に取得したURLを「GAS endpoint URL」も入力しすることで、アプリで撮影した動画や条件にあてはまったときの各種センサ値など自動でUPされ、一覧で観れるようになる。ついで その欄の下の📧adsressに通知送信先のEmail Addressを入れておくことで、リアルタイムでメールも届くようになる。
防犯用途であれば、防犯カメラあるあるの「見直すのが大変」問題 や「見逃し」も軽減でき、アプリのセンサーを「うまく」活用することで入店または不正な侵入があったときだけの防犯カメラ映像を確認できるようになるよ。(併用をオススメ)

この記事が気に入ったらサポートをしてみませんか?