LoginSignup
10
4

More than 1 year has passed since last update.

【のこるんvol.4】3タップ完了LINEフォトアルバム #LINEDC #GAS #AppSheet

Posted at

スマホ中の写真 埋もれてない?

過去記事③ :【のこるんvol.3】3タップ完了LINEフォトアルバム
過去記事② :【のこるんvol.2】3タップ完了LINEフォトアルバム
過去記事① : 3タップで完了するLINEフォトアルバム

スマホがこの世に誕生し、写真の撮影枚数はそれ以前の1,500倍に、
1スマホの中に少なくとも1,000枚以上の写真があるそうです。

image.png

せっかく撮影しても、整理できずにいませんか?。
思い出が埋もれたり、写真と一緒に消えてしまうのは悲しい。
とはいえ新たにアプリを使うのはめんどくさい。

そこで・・・

プログラミングの「プ」の字も知らなかった初心者ですが、
日本一簡単操作のLINEフォトアルバムアプリを自分で作ります💪

写ルだけじゃなく残ルンです!! その名も「のこるん」ぜひ覚えて下さい♪
321.PNG

LINEで送付した写真が即反映されるようにする

【前回のトライ】
スプレッドシートの情報が、AppSheetを使い、WEBアプリとして表現できました。
image.png

ただしこの状態では、 LINEで送った写真が、AppSheetに反映しないことがあります。

【今回のトライ】
GAS部分のコードを書き変え、LINEで画像とコメントを送付すると、すぐに情報が更新され、
WEBアプリとして送った写真とコメントをフォトアルバムとして見れる状態にします。
image.png

STEP①写真を格納する位置を定める

まずは前回までの記事を参考に、
スプレッドシートをAppSheetでWEBアプリとして表現している状態にしてください。

Data→「シート1」→ViewColumns
image.png
4列目「URL」の「EDITABLE?」にチエックを入れてください→SAVE
右画面+ボタン→適当な画像をアップロードや→コメントも何か入力→
更新→シート1 これで新たな画像が投稿されました →SAVE

image.png

ここで一旦スプレッドシートに戻ります。この画像がGoogleDriveのどこに保存されているか確かめます。
image.png

先ほど追加された行を探してください。
今回は、シート1_Images/111.URL.102811.pngと書かれています。
これはGoogleDriveの 「シート1_Images」のフォルダの中に「111.URL.102811.png」というファイル
保存されていることを表しています。GoogleDriveを開いて確かめてみましょう。

image.png
ちゃんとありました。

STEP②GASのコードを書き変える

前回の記事から少しコードを書き変えます  (クリックで表示)



// 応答メッセージURL
const REPLY = "https://api.line.me/v2/bot/message/reply";

// アクセストークン
const ACCESS_TOKEN = "********";

// スプレッドシート情報

const SHEET_ID = '********';
const SHEET = SpreadsheetApp.openById(SHEET_ID).getSheetByName('シート1');

// Google Drive ID
const GOOGLE_DRIVE_ID = "********";

// LINEから送られてきたデータを取得 doPost()
function doPost(e) {

//メッセージ受信
const data = JSON.parse(e.postData.contents).events[0];
//ユーザーID取得
const lineUserId = data.source.userId;
// リプレイトークン取得
const replyToken = data.replyToken;
// 送信されたメッセージの種類を取得
// https://developers.line.biz/ja/docs/messaging-api/message-types/#sticker-messages
const postType = data.message.type;

//沖中追加①
const userMessage = JSON.parse(e.postData.contents).events[0].message.text;
//追加①ここまで

// 写真の時
if ( "image" === postType ) {
imageSave(replyToken, lineUserId, data);

} else {

SHEET.getRange('D' + 2).setValue(userMessage);
}

}

// 送信された画像を保存 imageSave()
function imageSave(replyToken, lineUserId, data) {

// LINEから画像取得 getImg()
const imgData = getImg(data);

// Googleドライブに保存 saveImg()
const imgInfo = saveImg(imgData, lineUserId);

// //「保存完了」とLINEにメッセージを送る
sendMessage(replyToken, imgInfo);

}

// LINEから画像取得 getImg()
function getImg(data) {

const IMG_URL = 'https://api-data.line.me/v2/bot/message/' + data.message.id + '/content';
const HEAD = {
"method":"get",
"headers": {
"Authorization" : "Bearer " + ACCESS_TOKEN
}
}
const imgData = UrlFetchApp.fetch(IMG_URL, HEAD);
return imgData;

}

// Googleドライブに保存 saveImg()
function saveImg(imgBinary, lineUserId){

//GoogleDriveフォルダID
const folder = DriveApp.getFolderById(GOOGLE_DRIVE_ID);
//ランダムな文字列を生成して、画像のファイル名とする
const fileName = Math.random().toString(36).slice(-8);
//Googleドライブのフォルダに画像を生成
const imageFile = folder.createFile(imgBinary.getBlob().setName(fileName));
//「保存しました」としたメッセージを変数に代入
const imgInfo = '画像保存したよ!コメントをどうぞ!';

//画像ファイルURL取得
const imageURL = '画像保存先フォルダ名/ 例ならシート1_Images/' + fileName;

//画像ファイルにリンクでアクセスの権限付与
imageFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);

debugImgLog(imageURL, lineUserId);
return imgInfo;

}

// スプレッドシートに画像を保存 debugImgLog()
function debugImgLog(text, userId) {

if ('' == text) {
return;
}

const date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')
const userName = getUserDisplayName(userId)
const userImg = getUserDisplayImg(userId)

SHEET.appendRow([userId,userId,text,userName,date,userName]);
// 日付順に並び替え
const numColumn = SHEET.getLastColumn(); // 最後列の列番号を取得
const numRow = SHEET.getLastRow()-1; // 最後行の行番号を取得
const dataRange = SHEET.getRange(2, 1, numRow, numColumn);
dataRange.sort([{column: 5, ascending: false}]);

}

// ユーザーのプロフィール名取得 getUserDisplayName()
function getUserDisplayName(userId) {

const url = 'https://api.line.me/v2/bot/profile/' + userId;
const userProfile = UrlFetchApp.fetch(url,{
'headers': {
'Authorization' : 'Bearer ' + ACCESS_TOKEN,
},
})
return JSON.parse(userProfile).displayName;

}

// ユーザーのプロフィール画像取得 getUserDisplayImg()
function getUserDisplayImg(userId) {

const url = 'https://api.line.me/v2/bot/profile/' + userId;
const userProfile = UrlFetchApp.fetch(url,{
'headers': {
'Authorization' : 'Bearer ' + ACCESS_TOKEN,
},
})
return JSON.parse(userProfile).pictureUrl;

}

// LINEにメッセージ送信 sendMessage()
function sendMessage(replyToken, replyText) {

const postData = {
"replyToken" : replyToken,
"messages" : [
{
"type" : "text",
"text" : replyText
}
]
};

const headers = {
"Content-Type" : "application/json; charset=UTF-8",
"Authorization" : "Bearer " + ACCESS_TOKEN
};

const options = {
"method" : "POST",
"headers" : headers,
"payload" : JSON.stringify(postData)
};

return UrlFetchApp.fetch(REPLY, options);

}

変更点①GoogleDriveのIDを先ほどの画像が保存されているフォルダIDに変更する
変更点②imageURLを今回設定した保存先フォルダ名に書き変える
const imageURL = '画像保存先フォルダ名/ 例ならシート1_Images/' + fileName

①②の操作により、LINEから送られてきた画像が指定したフォルダに格納され、
AppSheetで表示されるようになるはずです!

STEP③見やすいデザインに変更する

最後にデザインを変更していきます UX→アイコン名をつける→Viewtype→Sorbyで新着順か古い順を選択
image.png

Copyで別の表示アイコン作成可能→Image sizeも変更してバリエーションを増やせます
image.png

Displayでロゴも変えてみましょう アプリっぽくなってきたぞ~
image.png

Brandからはカラーやアイコンが変更できます
image.png

「SAVE」を忘れずにクリックし 共有したい人(無料枠では10名まで)を選択 これでついに完成です!
image.png

ぜひアプリのAppSheetで見てみてください!簡単にアルバム化ができて感動ですよ~!!
ios版
GooglePlay版

思い出が消えない未来を目指したい

埋もれていく写真・思い出を救いたい。そんな思いでLINEの簡単操作だけでアルバムが出来る
アプリ「のこるん」を開発してきました。

すこしは写真整理が楽になりましたが、これまで撮った膨大な写真はまだ埋もれていて
写真整理の悩みは尽きません。今後も少しでも役に立ちそうなアプリ開発に向けて
活動を続けていきたいと思います!!

最後に、長文お付き合い頂きましたみなさま、ありがとうございました。
みなさまもLGTMが、開発の大変な励みになりました!!これからもよろしくお願いします!!

過去記事③ :【のこるんvol.3】3タップ完了LINEフォトアルバム
過去記事② :【のこるんvol.2】3タップ完了LINEフォトアルバム
過去記事① : 3タップで完了するLINEフォトアルバム

Group 48 (1).png
Group 49.png
Group 64.png
Group 45.png

今回の開発をもって、クラウドファンディングにも挑戦しておりました。
たくさんの支援を頂き、先日サクセスすることが出来ました。
この場を借りて、お礼申し上げます。最後まで開発できたのは
Qiita記事を通して、皆さまが応援くださったおかげです。本当にありがとうございました。

10
4
0

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
10
4