![見出し画像](https://assets.st-note.com/production/uploads/images/155968448/rectangle_large_type_2_b079535be7417989ac407996694016e0.png?width=1200)
【無料公開】AIがあなたの読書ノートを作る!名文コレクションの作り方
前回の記事で、AIの力を使って気に入った文章をGoogleスプレッドシートに自動的に保存する「名文コレクション」の紹介をしました。
今回は、実際の作成方法を無料で公開したいと思います!
それでは、早速作成していきましょう!
【この記事はGoogleアカウントを既に持っている方を対象としています】
(GoogleスプレッドシートとGoogle Apps Scriptを使うため)
1. Difyのアカウントの作成
(既にアカウントを持っている方は、2. Difyのワークフローの作成に移動してください)
1-1. Difyのウェブページを開く
まず、以下のURLからDifyのウェブページを開きます。
1-2. 「始める」のボタンを押し、Googleアカウントでサインインをする
右上にある、「始める」ボタンをクリックします。
![](https://assets.st-note.com/img/1727521600-iuU6Bqbe2wMrgJDd7pEPm5XF.png?width=1200)
すると、以下のようにログイン方法を確認されるので、「Googleで続行」をクリックし、Googleアカウントでサインインします。
![](https://assets.st-note.com/img/1727521710-hnXWrtKviYkEjw6q1g4cVIHF.png)
1-3. 作成画面が出てきたらOK!
以下のような、作成画面が出てきたらOKです。
![](https://assets.st-note.com/img/1727522014-zv7dpwSBjg9hYcMm56UDC4L1.png?width=1200)
2. Difyのワークフローの作成
ここからは実際にDifyのワークフローを作成していきます。
2-1. ワークフローを選択し、アプリの名前をつける
「最初から作成」を選び、「ワークフロー」を選択、アプリの名前等をつけて「作成する」をクリックします。
![](https://assets.st-note.com/img/1727522800-UmkWFjf0dNLDqz3SxIBX4TiY.png?width=1200)
作成画面は「オーケストレート」をクリックして表示させます。
最初は「開始」だけがある状態です。
![](https://assets.st-note.com/img/1727522886-46n9qbP2ohx0XNWtVfcsMOIH.png?width=1200)
ここから、必要なブロックや変数を追加していきます。
2-2. 画像が認識できるように機能を追加する
初めに、今回は画像認識ができるようにしたいので、編集画面右上の「機能」のボタンをクリックします。
![](https://assets.st-note.com/img/1727575168-Kw3AIMQSknXc2zf8GDgRuCBH.png)
すると、以下のように機能の画面が表示されるので、「画像アップロード」をオンにします。
![](https://assets.st-note.com/img/1727575199-rXhGc6YvZEiIlxWSmp1FHJDQ.png)
2-3. 環境変数を設定する
次に、右上の「ENV」のボタンをクリックし、「環境変数を追加」をクリックします。
![](https://assets.st-note.com/img/1727523528-3yQhTb9DAWGf1lUv4utRiXgo.png?width=1200)
環境変数の画面では以下のように設定します。(値の部分は後から変更しますが、今の段階では「1」で大丈夫です)
![](https://assets.st-note.com/img/1727523508-oWFnfQhxiw8e0zjPAb3vDTr7.png)
2-4. 必要なブロックを作成し、繋げていく
次に、実際の編集画面に戻り、開始の隣からブロックを追加していきます。
追加の仕方は、画面下の「+」ボタンを押すことで、繋げたいブロックが選択できます。開始の隣には「IF/ELSE」を置くので、選択します。
![](https://assets.st-note.com/img/1727524666-uaiJwj1ZrQ5pEcOlgLxPB7XS.png)
「開始」の隣に「IF/ELSE」を置き、2つを繋げます。
![](https://assets.st-note.com/img/1727524689-SnbejZGAc4VUPkgQ8TJayEHO.png)
次に同じようにして、「LLM」のブロックを置き、繋げていきます。
![](https://assets.st-note.com/img/1727524709-HC3n6Uh1AImBaFLJT9tNGdl4.png?width=1200)
以後は、繰り返しになりますので、最終的なブロックの配置を以下でお示しします。
![](https://assets.st-note.com/img/1727524723-IwMaWn8UuNRmFzAvq5k97SiG.png?width=1200)
ブロックの設定としては以上で完了です。
2-5. AIへの指示内容をブロックに入れる
ここからは、それぞれ作成したブロックの編集を行なっていきます。
⑴開始ブロックの編集
![](https://assets.st-note.com/img/1727574080-8MysT6jiXm2vdK7rIAJZtPcY.png?width=1200)
開始ブロックでは、「入力フィールド」と呼ばれる最初の場合分けをする項目を2つ作成していきます。
【入力フィールド①:短文】
![](https://assets.st-note.com/img/1727574109-nqGB13c9MHyIp67KfLQYRj4d.png)
【入力フィールド②:選択肢】
![](https://assets.st-note.com/img/1727574123-XJOiVInZ1HefTqlLYoFGmW4S.png)
⑵「IF/ELSE」の編集
![](https://assets.st-note.com/img/1727574954-Ka7zlfJMbwsFXQRTdCVyHLYA.png?width=1200)
「IF/ELSE」では条件の分岐を行ないます。
インプットは上側、アウトプットは下側の流れに進むように、以下の設定を行なっていきます。
![](https://assets.st-note.com/img/1727574988-r4FURdp6y0HM2EVzDasOYg5J.png)
条件を「である」にして、その下に「インプット」と入力
![](https://assets.st-note.com/img/1727575028-vbsfuWLQwZoExDR0HKGFrVmO.png)
これで、入力フィールド②:選択肢「input_or_output」で「インプット」と選んだ場合に、IFの方向(上側)に進むように設定できました。(今の設定では、インプット以外は下側に進むようになっております。)
⑶上側のLLMの編集
続いて、開始ブロックの時と同様に、「LLMブロック」の編集画面を出し、画像のように設定を行なっていきます。
![](https://assets.st-note.com/img/1727591881-NLqXd3WOfVIrl1BHvCpJFaxh.png?width=1200)
【SYSTEMの部分には以下の文章をそのままコピーしてください】
添付される画像ファイルの青色マーカーもしくは緑色マーカー部分を一字一句違わずに抜き出してください。
抜き出した文章が2行以上になる場合は、前の文章と繋げて1行で出力してください。
抜き出した文章以外は出力しないでください。
次に3本線の部分をクリックして、モデルのパラメータを変更します。
![](https://assets.st-note.com/img/1727591924-bl7UBFCt8xGfyIkjZO3zmRAL.png?width=1200)
⑷上側のHTTPリクエストの編集
LLMブロックの隣にセットした「HTTPリクエスト」のブロックは以下のように設定します。
![](https://assets.st-note.com/img/1727574737-Oj9g47e6VvDys5UIJCYAfkx0.jpg?width=1200)
JSONの選択後、「/」を入力すると、変数の一覧が出てくるので、「LLM text」を選択します。
![](https://assets.st-note.com/img/1727591965-GxTktw19j2ZBuF75WoaeLXmY.png)
⑸上側の「終了」ブロックの編集
終了ブロックでは、抜き出した文章が出力されるように、以下のように設定します。
![](https://assets.st-note.com/img/1727574893-v618gUe5nTzI3WXRQAoFBPkw.png?width=1200)
![](https://assets.st-note.com/img/1727576086-EYl15jsWf4FzDQhANxoy9bZc.png)
⑹下側の「HTTPリクエスト 2」の編集
下側の「HTTPリクエスト 2」のブロックは以下のように設定します。
![](https://assets.st-note.com/img/1727576181-ef7uBjEsbPvY2TVNxMiQL4Jy.png?width=1200)
⑺下側の「LLM 2」の編集
![](https://assets.st-note.com/img/1727576231-B52PJLVSDMg6YZawzymWh7rx.png?width=1200)
【SYSTEMの部分には以下の文章をそのままコピーしてください】
「」と似た、もしくはそのままの言葉が含まれている文章を「」に保存されている文章から近しい文章を選び出し、その文章のまま返答してください。
☞「」の中はそれぞれ以下のように設定します。
![](https://assets.st-note.com/img/1727576370-5E721Jc9fjPVzWnmrXLuBF40.png)
![](https://assets.st-note.com/img/1727576409-nrZVpTE8GoW62bz9gxmFQthM.png)
次に3本線の部分をクリックして、モデルのパラメータを変更します。
![](https://assets.st-note.com/img/1727576546-jA7xBNLImtfwK3p2rk5VF6gX.png?width=1200)
⑻下側の「終了 2」の編集
![](https://assets.st-note.com/img/1727576719-BOZH1ESX2wDP0AomiacLvqMt.png?width=1200)
以上で、ブロックの編集は完了です。
ひとまず、ここでワークフローの作成は一度置いておきます。
3. Googleスプレッドシートの準備
次に、気に入った名文を保存していくための新しいスプレッドシートを作成していきます。
3-1. 新しいスプレッドシートの作成
新しいスプレッドシートを作成します。
![](https://assets.st-note.com/img/1727526888-X6KliUgRQrxMeqAWmZOpNkw5.png?width=1200)
以下のようにスプレッドシートの名称を変更し、一行目には「出力年月日」「時間」「出力データ」の順で並べます。(2行目以降でデータが並ぶことになります)
![](https://assets.st-note.com/img/1727526902-FS7d9rn2KgpwaUbfeIvBTE4t.png)
続いて、以下のように「共有」の設定を行なっていきます。
![](https://assets.st-note.com/img/1727526931-eu9kaYTtsjpFmPZx1hHBWUbK.png?width=1200)
3-2. スプレッドシートのIDを保存しておく
次にスプレッドシートのIDを保存しておきます。
スプレッドシートのIDは以下の画面から確認することができます。
![](https://assets.st-note.com/img/1727526952-f1ZsC8B50Ovj97Vdic4quYoJ.png?width=1200)
「https://docs.google.com/spreadsheets/d/14_HP6ugW3VEhcoBprchrzSUsugkqhsvvOcnEmEE4QG4/edit?gid=0#gid=0」
4. Google Apps Script(GAS)の作成
次に、Google Apps Script(GAS)というサービスを使用していきます。
ここは本来であれば、プログラミングの知識が必要ですが、コピペで使えるコードを用意していますので、ぜひ挑戦してみてください!
4-1. Google Apps Scriptを開く
初めにスプレッドシートの拡張機能からApps Scriptを選択します。
![](https://assets.st-note.com/img/1727530388-WdQI1ZGvajE2Dwe08HqSrXTN.png?width=1200)
4-2. Google Apps Scriptの画面設定
すると、以下のApps Scriptの画面に移りますので、Scriptの名前の変更(名文コレクション)と「コード.gs」の名前を「インプット」に変更します。
![](https://assets.st-note.com/img/1727530505-iVok3cEwyG5M4C19uBPeRHjF.png?width=1200)
次に、「+」ボタンを押し、新しいスクリプトを追加し、名称を「アウトプット」としておきます。
![](https://assets.st-note.com/img/1727530698-fAWUOae460rBMbtERDyIC5lK.png)
![](https://assets.st-note.com/img/1727530722-akvsD81YAS20TKHXmerf9Zhn.png)
4-3. インプット用コードのコピペ
続いて、インプットのスクリプトにこれから紹介するコードをコピペします。
![](https://assets.st-note.com/img/1727530740-tLPZfF1OGbz2u05xv8NMqkdD.png?width=1200)
★インプット用コード★
function doPost(e) {
try {
// スプレッドシートのIDを設定
var spreadsheetId = "実際のスプレッドシートIDに置き換えてください";
var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheet = spreadsheet.getSheetByName("シート1");
// リクエストの内容を取得
var postData = e.postData.contents;
// データの解析: JSON形式を想定
var outputText;
try {
var data = JSON.parse(postData);
outputText = data.text || "No text provided";
} catch (err) {
// JSONパースに失敗した場合、postDataをそのまま使用
outputText = postData;
}
// 現在の日時を取得
var now = new Date();
var date = Utilities.formatDate(now, Session.getScriptTimeZone(), "yyyy/MM/dd");
var time = Utilities.formatDate(now, Session.getScriptTimeZone(), "HH:mm:ss");
// スプレッドシートに新しい行を追加(出力年月日、時間、出力データの順)
sheet.appendRow([date, time, outputText]);
// 成功レスポンス
return ContentService
.createTextOutput(JSON.stringify({ status: "success", message: "Data appended" }))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
Logger.log("Error in doPost: " + error.toString());
// エラーレスポンス
return ContentService
.createTextOutput(JSON.stringify({ status: "error", message: error.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
4-4. スプレッドシートのIDを入力
「実際のスプレッドシートIDに置き換えてください」の部分を「スプレッドシートID」に置き換えます。
![](https://assets.st-note.com/img/1727530778-lYgPpeWdaT794CkEFcytjVMQ.png?width=1200)
4-5. アウトプット用コードのコピペ
続いて、先ほどと同様にしてアウトプットのスクリプトにこれから紹介するコードをコピペします。
![](https://assets.st-note.com/img/1727529922-SrQ57gBEfajJo90MXUqyNweA.png?width=1200)
★アウトプット用コード★
function doGet(e) {
try {
// スプレッドシートのIDを設定
var spreadsheetId = "実際のスプレッドシートIDに置き換えてください";
var sheetName = "シート1";
// スプレッドシートとシートを取得
var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
Logger.log("指定されたシートが見つかりません: " + sheetName);
return ContentService
.createTextOutput(JSON.stringify({ status: "error", message: "指定されたシートが見つかりません。" }))
.setMimeType(ContentService.MimeType.JSON);
}
// シートから全データを取得
var dataRange = sheet.getDataRange();
var data = dataRange.getValues();
// デバッグ用ログ
Logger.log("取得したデータ行数: " + data.length);
Logger.log("データ内容: " + JSON.stringify(data));
if (data.length < 2) { // ヘッダー行のみの場合
Logger.log("シートにデータ行が存在しません。");
return ContentService
.createTextOutput(JSON.stringify({ status: "success", data: [] }))
.setMimeType(ContentService.MimeType.JSON);
}
// ヘッダーを取得
var headers = data[0];
Logger.log("ヘッダー: " + JSON.stringify(headers));
// 「出力データ」列のインデックスを特定
var outputDataIndex = headers.indexOf("出力データ");
if (outputDataIndex === -1) {
Logger.log("\"出力データ\" 列が見つかりません。");
return ContentService
.createTextOutput(JSON.stringify({ status: "error", message: "\"出力データ\" 列が見つかりません。" }))
.setMimeType(ContentService.MimeType.JSON);
}
// 「出力データ」を抽出し、箇条書き形式に整形
var bulletList = data.slice(1).map(function(row) {
return "• " + row[outputDataIndex];
}).join("\n");
Logger.log("箇条書きリスト:\n" + bulletList);
// レスポンスとして箇条書きリストを返す
return ContentService
.createTextOutput(bulletList)
.setMimeType(ContentService.MimeType.TEXT);
} catch (error) {
Logger.log("Error in doGet: " + error.toString());
// エラーレスポンス
return ContentService
.createTextOutput(JSON.stringify({ status: "error", message: error.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
4-6. スプレッドシートのIDを入力
先ほどと同様に「実際のスプレッドシートIDに置き換えてください」の部分を「スプレッドシートID」に置き換えます。
![](https://assets.st-note.com/img/1727530034-LInAqVXKrQd75vHEoZMC2gfp.png?width=1200)
最後に「▶️実行」の左隣にある「保存ボタン」を押して、コードの作成は完了です。
4-7. ウェブアプリとして公開
次に作成したGoogle Apps Scriptを以下の順番でウェブアプリとしてデプロイします。
![](https://assets.st-note.com/img/1727529561-GQ1ipqthTx7PCuHUb43KIOoy.png?width=1200)
![](https://assets.st-note.com/img/1727529571-gnqOB0w1xkh5C34uH79jEmTo.png)
![](https://assets.st-note.com/img/1727529582-7B6FjoIQWfn0UyV4cDkYGZN5.png?width=1200)
![](https://assets.st-note.com/img/1727529430-5ZP2KkhDQF38c1jUinfoTORp.png?width=1200)
![](https://assets.st-note.com/img/1727529484-wik6PSs03ZGbcIqR8Of7YVna.png?width=1200)
![](https://assets.st-note.com/img/1727529521-n9ABsS76idZzX1DaYEfbVoCG.png)
![](https://assets.st-note.com/img/1727529677-t9wrpIXWgZDE6Pqez17Lns0C.png?width=1200)
![](https://assets.st-note.com/img/1727529607-bAp8D2nL1BQUcoOVajJdsHui.png?width=1200)
![](https://assets.st-note.com/img/1727529632-grKNSiAjH2XDk1oQ4TZulLO5.png)
以上のステップでウェブアプリが公開されます。
4-8. ウェブアプリのURLをコピーしておく
ウェブアプリが公開され、作成されるウェブアプリのURLをコピーしておきます。
![](https://assets.st-note.com/img/1727529330-Zigb95kO3eSI6VPW7XzNYBMG.png?width=1200)
5. DifyとGASを繋げる
ここではDifyからGASで作成したコードを動かせるように設定していきます。
Difyの編集画面に戻り、「2-2. 環境変数を設定する」で作った「1」の環境変数に「4-6. URLをコピーしておく」でコピーしたURLを入れます。
![](https://assets.st-note.com/img/1727529206-INonmpQlBsCwMZ0RrajxDhz6.png?width=1200)
以上で、ワークフローとしては完成です!
6. 実際の動きを確認してみる
一度Web上で期待通りに動くか確認してみましょう。
Difyの編集画面の右上にある「公開する」のボタンをクリックし、「公開する」をクリックすると今まで作成したアプリが更新され、使えるようになるはずです。
![](https://assets.st-note.com/img/1727577786-Ej47oGR8TPe5JvflYZhC3H2x.png)
実行のボタンを押すと「Test Run」の画面が出てくるので、以下のように動かしてみます。
![](https://assets.st-note.com/img/1727592361-WxoQq1J9zjlb7EpGyZwBHmOk.png)
作成したスプレッドシートに出力されていたら成功です!
(精度は100%ではありません。より高い精度のAIモデルもありますが、課金が必要になります)
![](https://assets.st-note.com/img/1727592361-t7ViRFPZQA1OfweCpGak60qH.png?width=1200)
7. 完成!
ちゃんと期待通りに動くことを確認できたら、スマホから使えるようにURLを保存しておきましょう。
「監視」の部分からWebアプリの2次元バーコードをクリックすると、スマホのカメラでURLが読み込めるようになります。
![](https://assets.st-note.com/img/1727577747-qT2hOg5i0FsZXK31VnN7jEQM.png?width=1200)
言語設定を変えるには、「設定」をクリックし、言語を「日本語」に設定します。
![](https://assets.st-note.com/img/1727593042-jsP7Vhpyt841XwGF3DqY5Sbz.png?width=1200)
![](https://assets.st-note.com/img/1727593187-Zafbiolc2I3vkn6F1xwS0KgU.png)
最終的なスマホ上の画面が以下になります!
![](https://assets.st-note.com/img/1727593423-IeQ7M9n3Rw81fAmkHsP6jThY.jpg?width=1200)
これで、スマホで写真・スクショした文章のマーカー部分をアプリを通して自分のGoogleスプレッドシートに保存することができるようになりました!
8. 最後に
おつかれさまでした!
ここまでお読み頂きありがとうございます。
今後も日常生活に役立ちそうなAIツールの紹介と作り方を説明していきますので、面白いと思った方はぜひ「フォロー」と「スキ」をお願いいたします!
感想やコメントもお待ちしております!