18
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

iOSのショートカットとGASを使って紙のお知らせの保存&リマインダー機能を作った #iOSショートカット #紙の電子化

Last updated at Posted at 2021-11-18

##まずはこれを見てほしい
cSVGr4qw.jpeg
我が子の保育園から貰うお知らせです。
ふむふむ、11/22までにボーダー柄の服とビニール袋をお持ちせよ。とな?
良し、期限まで時間もあるし、とりあえず置いておこう ←絶対忘れるやつ

というわけで、LINEやメールが主流になった昨今ですが、まだまだ紙でのお知らせはたくさん来ると思います。紙なので埋もれやすいしそれ自体が邪魔になると思う人も多いのではないでしょうか。私のことです。
携帯に記録しておくにも入力が面倒ですし、案外大事な情報が載っていたりするので紙のまま置いておいた方がよかったりします。

こんな面倒ごとを、iOSのショートカット、Dropbox、Google Apps Script、LINE Notifyを駆使して解消してみました。

##完成品
お知らせをカメラで撮影し、その内容をDropboxとスプレッドシートに保存することで、紙のお知らせの"電子化"と"リマインダー機能"を作成しました。
sys.JPG

####①インプット
iOS標準のショートカット機能を使用し以下を順に実行する。
・カメラで写真を撮る
・写真に名前(締切日)をつける
・Dropboxに保存する
・名前とURLをスプレッドシート(webhook)に記録する
実際の動きはこちら。
自分でやるのは写真撮って日付入れるだけなので楽ちんです。

####②アウトプット
GASをタイマーで起動し、対象があればLINEに通知する。
URLから画像が表示されるのでぱっと見で内容がつかめるのが便利です。
LINEなので通知を家族間で共有することもできます。
通知画面はこちら。
7zH3FrKw.png

スプレッドシートの中身はこちら。
入力した締切日を元に関数で日数を計算して判定しています。
list.JPG

##ソースコード(GASのみ)

長いので省略
コード.js

function doPost(e) {
  var params = JSON.parse(e.postData.getDataAsString()); // POSTされたデータを取得
  var myData = params.mydata.value;  // ショートカットで指定したPOSTデータを取得
  var myUrl = params.myurl.value;  // ショートカットで指定したPOSTデータを取得
  var result = {};
     
  var output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  
  if (myData){
    
    result = {
      "success" : {
        "message" : "正常に処理されました。"
      }
    };
    addLog( JSON.stringify(myData),JSON.stringify(myUrl) ); // スプレッドシートにショートカットから送信されてきたデータを記録
    
  } else {
    result = {
   "error": {
       "message": "データがありません。"
     }
   };
  }
  
  // 返すデータ(上記のresult)をセットする
  output.setContent(JSON.stringify(result));
  
  // リクエスト元(ショートカット)に返す
  return output;
}

function addLog(text1,text2) {
  var spreadsheetId = "1LBZcRNfIO0P2axoUl7XzvYyPK7poec5n5eYhA0DIrwU"; // スプレッドシートID
  var sheetName = "list"; // スプレッドシート名
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  var lastRow = sheet.getLastRow();  
  lastRow = lastRow + 1;
  strformula1 = "=TEXT(SUBSTITUTE(B" + lastRow + ",\"\"\"\",\"\"),\"0000\"\"/\"\"00\"\"/\"\"00\")";
  strformula2 = "=datedif(TODAY(),D" + lastRow + ",\"d\")";
  sheet.appendRow([new Date(),text1,text2,strformula1,strformula2]); // スプレッドシートにタイムスタンプと引数を書き込む
}

function find(){
  var spreadsheetId = "1LBZcRNfIO0P2axoUl7XzvYyPK7poec5n5eYhA0DIrwU"; // スプレッドシートID
  var sheetName = "list"; // スプレッドシート名
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  const lastRow = sheet.getLastRow(); 
  var cnt = 0;

  for(let i = 2; i <= lastRow; i++) {
    var shime = sheet.getRange(i,5).getValue();
    if (shime == '3'){
      cnt++;
      var surl = sheet.getRange(i,3).getValue();
      var Message = "その"+ cnt + "\n締め切りが近いお知らせがあるよ、やった?" + surl;
      sendToLine(Message);
    }
  }
}

function sendToLine(text){
  var token = "MFftDac18WRkETCmB9uO4da6aBg0hDvqtVJrFq5qmTL";  
  var options =
   {
     "method"  : "post",
     "payload" : "message="+ text,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

##ポイント解説

####ショートカット(iOS)
以下のようなイメージで作成します。
基本的には画面下部の「+」を押して既定のアクションを選びます。種類が豊富なので大体のことができそうです。
webhookは、アクション「URL」と「ネットワーク」の組み合わせで実行します。
スプレッドシートに、写真につけた”名前”とDropboxの共有リンクをJSON形式で渡しています。
SCR.png

そもそもショートカットって何?という方向け→こちら。

####GAS
スプレッドシートに書き込んでいるロジックはここ。
日付判定のために関数を入れ込んでいますが、関数に"(ダブルコーテーション)を多用していたため構文エラーが取れませんでした。こういう場合は、"の前に\を入れればよいみたいです。

コード.js

function addLog(text1,text2) {
  var spreadsheetId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // スプレッドシートID
  var sheetName = "list"; // スプレッドシート名
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  var lastRow = sheet.getLastRow();  
  lastRow = lastRow + 1;
  strformula1 = "=TEXT(SUBSTITUTE(B" + lastRow + ",\"\"\"\",\"\"),\"0000\"\"/\"\"00\"\"/\"\"00\")";
  strformula2 = "=datedif(TODAY(),D" + lastRow + ",\"d\")";
  sheet.appendRow([new Date(),text1,text2,strformula1,strformula2]); // スプレッドシートにタイムスタンプと引数を書き込む
}

##使用後の評価

:sparkles:紙媒体の電子化はGood!:sparkles:
中身が確認できればなんでもよいので電子化して問題なし。夫婦間で共有できるので電子化後は紙は捨てました。(少し部屋が片付いた)
写真撮ったらDropboxに保存されるのもアップロードの手間が省けて便利です。
全体的に妻にも好評でした。
あと写真がiPhone本体に保存されないのが地味にGoodです。

:sparkles:リマインダー機能はLINEで届くのがGood!:sparkles:
グループチャットで夫婦間で同じ通知が見れるのがよいです。そのまま、これやったっけ?やってるわ。という会話につなげられるのが便利です。

:sweat_drops:導入が面倒なところがBad...:sweat_drops:
他に人にも薦めようとしましたが、GASを組まなくてはいけないのがネックになり断念。
プログラミング未経験者に、GAS組んで~、デプロイして~、アクセストークン発行して~、はさすがに無理でした。

2勝1敗で成功です。(1敗は私には影響がないし)
紙リマインダーは我が家のツールとしてレギュラー入りを果たすことできました:clap::clap::clap:

#紙リマインダー2
:sweat_drops:導入が面倒なところがBad...:sweat_drops:
この部分を解決するために、機能縮小版を作成しました。

####紙リマ2・システム構成
導入に手間のあるGASとLINE Notifyの使用をやめ、その部分はiOSのカレンダー機能を使用します。
sys2.JPG

①インプット
iOS標準のショートカット機能を使用し以下を順に実行する。
・カメラで写真を撮る
・写真に名前(締切日)をつける
・Dropboxに保存する
・締切日の日付でカレンダーに登録、通知を2日前、URL欄に共有リンクを設定
インプットの操作感は紙リマも紙リマ2も変わりません。
実際の動きはこちら。(引用ツイートなので、2個目の動画は上の動画と同じです。。。)

②アウトプット
iOSカレンダーの通知設定が2日前となっているので自動でリマインダーされます。
その中にURLからお知らせの画像を参照します。
LINE通知ではないので共有しづらいのがso bad

ショートカットのレシピ
rem2.png

##感想
思った以上に便利でした。日常の面倒な作業をiPaaSできた気がします。
長いことiOSユーザーをやってきましたが、ショートカットは「なんかみたことある」程度の状態だったのですが、ここまで便利なものとは思っていませんでした。流石Apple、ついていくぞApple。
日常に転がっている面倒ごとをどんどんiPaaSしていきたいと思います。

18
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?