こんにちは。「学びの探究者」です。普段はnoteで活動しています。
2025年のQiitaアドベントカレンダーでは、
「ノーコード/ローコードで、自分のコンテンツ基盤を自動化していく」
をテーマに、25日間の仕組みづくりを記録していきます。
ぜひ、応援してください。
Day2 の今日は、Day1で抽出したnote記事情報を Googleスプレッドシート(以下スプシ)に書き込む 処理を実装します。
調べてみると、Dify では append row(行を追加する方法)を使った例は見つかるのですが、
公式が提供している 「Google Sheets プラグイン」 を使って
Batch Get や Batch Update で行を更新している記事は、意外と少ない印象でした。
そのため、今回は自分用のメモとして、
プラグインを使ったスプレッドシート更新のワークフロー をまとめています。
どなたかの参考になれば嬉しいです。
今日の処理フロー(全体)
ワークフロー構成は以下の7ステップ:
- Start(記事URLを受け取る)
- Web Scraper(本文抽出)
- LLM(title/description/published_date/tags/body_text をJSON整形)
- Batch Get(スプシ全行を取得)
- Code(次の空き行 or 更新行のインデックスを判定)
- Batch Update(該当行にデータを書き込む)
- 終了
実務向けの非常に綺麗な構成になっています。
1. スプレッドシートの準備
今回は、スプシをできるだけシンプルに保つため、
カラムは次の4つだけにしています。
| A列 | B列 | C列 | D列 |
|---|---|---|---|
| title | url | editdate | tags |
-
title:記事タイトル -
url:note記事のURL -
editdate:更新日(今回の実行日や公開日のどちらでもOK) -
tags:記事につけたいタグ(カンマ区切り)
▼ スプレッドシートURLのID部分
API設定や Dify のプラグインで使うので、
docs.google.com/spreadsheets/d/XXXXX/edit#gid=0 の
XXXXX を控えておきます。
2. Dify側で Google Sheets を接続
- 「ツール」→「Marketplace」
-
Google Sheetsをインストール - Googleアカウントと接続
3. Batch Get でスプシの全行を読み込む
Batch Get は、
「指定したシートの現在の内容をまとめて取得する」
ためのノードです。
今回の処理では、
- 既に同じ URL が登録されているか?
- それとも新しい記事として追加するか?
を判定するため、最初に全行を取得しています。
▼ Batch Get の設定(画面の意味を簡潔に)
① Spreadsheet ID
- スプレッドシートURLの
docs.google.com/spreadsheets/d/XXXXX/edit#gid=0
のXXXXXを入力します。
② Range
- 取得したい範囲を A1 記法で指定します。
- 今回はシート全体を対象にしたいため、例として
["シート1!A:D"]
のように、全列を含む範囲を指定しています。
▼ Batch Get の返り値イメージ
{
"files": [],
"json": [
{
"spreadsheetId": "スプシID",
"valueRanges": [
{
"majorDimension": "ROWS",
"range": "'シート1'!A1:D998",
"values": [
[
"title",
"url",
"editdate",
"tags"
],
[
"わたしの物差しは私のもの。削らなくていい。",
"https://note.com/lovely_hawk768/n/n0faabdc39561",
"2025年11月6日 21:00",
"* #自分, * #大切, * #価値観, * #気持, * #物差,"
]
]
}
]
}
],
"text": ""
}
この配列を後続の Code ノードで読み取り、
同じURLがあるかどうか→行番号の決定
という流れに使っています。
4. コード実行ノードで「次に書き込む行の範囲」を作る
Batch Get でシート全体を読み込んだあとは、
次にどの行へデータを書き込むか(Range指定) を
コード実行ノードで計算しています。
今回のコードは非常にシンプルで、
- Batch Get の結果から 最終行番号を取得
- 次に書き込む行番号(最終行+1)を計算
-
A:Dの4列分に対応した Range 文字列
(例:シート1!A5:D5)
を組み立てて返す
という処理を行っています。
このスクリプトは ChatGPT に叩き台を作ってもらい、シート構造に合わせて少し調整したものです。
▼ 実際に使っているコード
function main({ ss_body, sheet_name = "シート1" }) {
const last_row = ss_body[0].valueRanges[0].values.length;
const new_line_num = last_row + 1;
const range = `${sheet_name}!A${new_line_num}:D${new_line_num}`;
return { result: range };
}
▼ 処理の流れ(簡潔に)
-
last_row
→ スプレッドシートの現在の行数 -
new_line_num
→ 次に書き込む行番号(= 最終行+1) -
range
→ Batch Update 用の書き込み範囲
(A列〜D列の4カラムに対応)
この range をそのまま Batch Update ノードの Range に渡し、
次の行へデータを書き込む仕組みになっています。
5. Batch Update で該当行だけ更新する
書き込む行番号(例:3)と、
その行の A〜D 列に対応する Range(例:シート1!A3:D3)は、
ひとつ前のコード実行ノードで生成しています。
Batch Update ノードでは、この Range をそのまま使い、
1 行分だけの値をピンポイントで上書きする 仕組みになっています。
---
▼ 今回の Batch Update の設定内容
① Spreadsheet ID
- スプレッドシートの
/d/XXXXX/にあたる部分を指定するだけ - Batch Get と同じ ID を使います
② Data(ここが今回のポイント)
設定は至ってシンプルで、jsonのお手本がノードの説明に小さく書いてあるのでそこをうまく利用し、パラメータはDifyの機能を使って指定します。
[{
"range":"コードノードの出力結果",
"values":[
["LLMノードで出力したtitle",
"開始ノードで出力したurl",
"LLMノードで出力したeditdate",
"LLMノードで出力したtags"]
]
}]
6. 動作確認
ワークフローを実行すると:
- URLが初回なら→新しい行に追加
- 既存URLなら→その行が上書きされる
7. Day2で作った構成の良いところ
✅ Google スプレッドシート プラグインで完結する
Apps Script の設定やデプロイが不要で、
Dify のワークフローの中だけで処理が完結します。
✅ スプレッドシートを「DBのように」扱える
URLをキーにして行を更新できるので、
後々のメンテナンスやデータ管理がぐっと楽になります。
✅ 他ツールとの連携もしやすい
列構造をそろえたシンプルなテーブルになっているので、
Looker Studio や Python からそのまま読み込んで活用できます。
Day3 予告
Day3 では、このスプシを使って
オリジナルの “noteダッシュボード” を作る
ところに進みます。
- 公開日の推移
- タグ別の記事の傾向
- 自分の得意ジャンル分析
など、Looker Studio を使って視覚化していきます。
明日もよろしくお願いします 🙌

