実装ハンズオン

【Dify】医学論文仕分けアプリをつくる Part4:GAS連携でスプレッドシートに保存

更新:

連載シリーズ

Difyでつくる医学論文仕分けアプリ

全5回・PubMed API × Dify チャットワークフロー・GAS連携まで

  1. 全体像とPubMed API基礎
  2. パラメータ抽出とE-Search編
  3. E-Fetchとデータパース編
  4. AI処理・データ整形編
  5. データ保存とGAS連携編

目次

1. はじめに

本記事は、Difyのチャットワークフローを使ってPubMed論文の検索・翻訳・要約を自動化するシリーズのPart 4です。

これまでの復習:

  • Part 0: ワークフローの全体像とPubMed APIの基礎
  • Part 1: 自然言語クエリからE-SearchでPMIDを取得
  • Part 2: E-Fetch / E-Summaryで詳細データを取得し、XML/JSONをパース
  • Part 3: LLMでタイトル翻訳・要約・優先度判定を行い、CSVを生成
ワークフロー

Part 4(本記事)では、生成したCSVデータをGoogle Apps Script(GAS)に送信してスプレッドシートへ保存する処理を解説します。GASの基礎知識から実装手順、コードの詳細解説まで、一通り理解できるように構成しています。これにより、ユーザーはスプレッドシートのURLを受け取り、結果を即座に確認できるようになります。

シリーズ構成

  • Part0: 全体像とPubMed API基礎
  • Part 1: パラメータ抽出とE-Search編
  • Part 2: E-Fetchとデータパース編
  • Part 3: AI処理・データ整形編
  • Part4(本記事):  データ保存とGAS連携編

2. Part 3からの流れ

Part 3で生成したCSVは以下の形式でした。

"PMID","Priority","Title_JP","Summary","Title_EN","Authors","Journal","Year","DOI","MeSH_Keywords","URL","m ain_author_affiliation","research_area","publication_types","population"
"12345678","HIGH","糖尿病におけるインスリン療法の効果","本研究は、2型糖尿病患者におけるインスリン療法の
有効性を検証した。...","Effect of Insulin Therapy in Type 2 Diabetes","John Smith, Jane Doe","Diabetes Resear ch","2024","10.1234/example","diabetes, insulin, therapy","<https://pubmed.ncbi.nlm.nih.gov/12345678/","Uni
versity> of Tokyo","内分泌","Randomized Controlled Trial","2型糖尿病患者(成人)"

このCSV文字列をGASに送信してスプレッドシートに保存します。

3. Dify側の保存フロー

3-1. GASに追記(HTTP Request)

以下の画像ではURL保護のためにグレーアウトさせていますが、本記事の後半で設定方法を解説していますので順に読み進めて問題ありません。

GASに追記(HTTP Request)
項目 設定値
メソッド POST
URL URLは後ほどGAS側の設定をした後に発行されるものをコピーして使います。ここでは一旦スキップで大丈夫です。
ヘッダー Content-Type:application/json

このノードでは、DifyからGoogle Apps Script(GAS)のWebアプリを呼び出して、CSVデータをスプレッドシートに保存します。

リクエスト例

{
  "csv_string": "{{#csv_string#}}"
}

Part3で作成したCSV生成ノードからの csv_string を、JSON形式でGASに送信します。

レスポンス例

{
  "status": "success",
  "message": "Data appended successfully",
  "spreadsheet_url": "<https://docs.google.com/spreadsheets/d/>..."
}

GASからは、処理結果とスプレッドシートのURLが返されます。

3-2.スプレッドシートURLを抽出

スプレッドシートURLを抽出
import json

def main(body: str):
  if not body:
    raise ValueError("invalid parameter")
  result = json.loads(body)
  return {"spreadsheet_url": result["spreadsheet_url"]}

GASからのレスポンスから、スプレッドシートのURLを抽出します。

3-3. Answerノード

Answerノード
  • 応答:{{#spreadsheet_url#}}
  • 出力: スプレッドシートへのリンクのみをシンプルに表示

ここまででDify側のフローは完成しますが、実際に動作させるためには、GASのWebアプリを作成・デプロイする必要があります。以下、GASの基礎から実装手順まで順を追って解説します。

4. Google Apps Scriptとは?

4-1. Google Apps Scriptの概要

Google Apps Script(GAS)はGoogleが提供するクラウドベースのJavaScript実行環境で、Google Workspace(スプレッドシート、ドライブ、メール、カレンダーなど)を自動化・拡張するために設計されたプラットフォームです。  ブラウザ上のエディタだけで完結し、インフラ構築やサーバ管理なしでスクリプトを動かせるため、「ちょっとした業務自動化」から「小さな業務システム」までを素早く立ち上げられる点が特徴です。

4-2. Google Apps Scriptの主な特徴

特徴 説明
無料で利用可能 Googleアカウントさえあれば、追加費用なしで利用できます。Google Workspace有償プランでも追加課金なく使えます。
Google Workspaceとの親和性 スプレッドシート、ドライブ、メール、カレンダーなどとネイティブに連携でき、専用のAPIが多数用意されています。
Webアプリとして公開可能 HTTPリクエストで呼び出せるWebエンドポイントを数クリックで公開でき、今回のようにDifyから直接叩くことができます。
定期実行が可能 「毎日9時」「毎週月曜」のような時間ベースのトリガーや、フォーム送信などイベントベースのトリガーを簡単に設定できます。

GASがあると何が嬉しい?

GASは面倒な手作業を自動化するために用いられることが多いです。

例えば、本記事シリーズで解説している論文仕分けアプリでは、Difyが作成するcsvデータをSpreadsheet上に転記する作業をGASに任せます。そうすることで、Dify上で知りたいことを入力するだけで、Spreadsheet上にどんどん論文のリストが溜まっていく仕組みを構築することができます。

GAS

GASとDify連携で広がる可能性

Dify単体でも様々な外部ツールと連携して「生成AIによる要約や分類」「業務の自動化」を行うことができます。しかし、GASを用いてGmailやSpreadsheetと連携させることで、使い慣れたサービス上でDifyのパワーを発揮することが可能です。

例えば、

  • アポ見込みのある顧客についてのシートに対して、DifyとGASを用いて顧客情報をネットから付与していく
  • 安全性情報のスクリーニングを自動化して、スプレッドシートに結果をまとめる。
  • 製薬企業が出した最新のニュースをDifyで要約しながらGmailでまとめてメルマガのように運用する

など、様々な使い方が可能になります

5. GASの作り方とデプロイ手順

ここからは、実際にGASを作成してデプロイする手順を、ステップバイステップで解説します。

5-1. Google Apps Scriptエディタの開き方

  1. Googleスプレッドシートを開く
    • 新しいスプレッドシートを作成するか、既存のスプレッドシートを開きます
    • このスプレッドシートに、論文データが保存されます
  2. スクリプトエディタを開く
    • メニューから「拡張機能」→「Apps Script」を選択します
Googleスプレッドシート

スクリプトエディタが開くと、ブラウザ上にコードエディタが表示され、ここにコードを書き込んでいきます。

コードエディタ

5-2. コードの記述

スクリプトエディタに、以下のコードをコピー&ペーストします。

function doPost(e){
  var result = {status:'success',message:'Data appended successfully'};

  try{
  var csvString = "";
  try{
    var postData = JSON.parse(e.postData.contents);
    csvString=postData.csv_string||postData.csv_output||postData.output;
  }catch(jsonError){
    csvString=e.postData.contents;
  }

  if (!csvString) {
    throw new Error("No CSV data found.");
  }

  var csvData = Utilities.parseCsv(csvString);
  if (csvData.length < 2) {
    return createJsonResponse({ status: 'skipped', message: 'No content rows found in CSV' });
  }

  var csvHeaders = csvData.shift();
  var csvBody = csvData;

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  result.spreadsheet_url = ss.getUrl();

  var lastRow = sheet.getLastRow();

  if (lastRow === 0) {
    sheet.appendRow(csvHeaders);
    if (csvBody.length > 0) {
      sheet.getRange(2, 1, csvBody.length, csvBody[0].length).setValues(csvBody);
    }
  } else {
    var sheetHeaders = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var csvHeaderMap = {};
    csvHeaders.forEach(function(header, index) {
      csvHeaderMap[header] = index;
    });

    var outputRows = csvBody.map(function(row) {
      return sheetHeaders.map(function(sheetColName) {
        var csvColIndex = csvHeaderMap[sheetColName];
        return csvColIndex !== undefined?row[csvColIndex]:"";
      });
    });

    if (outputRows.length > 0) {
      sheet.getRange(lastRow + 1, 1, outputRows.length, outputRows[0].length).setValues(outputRows);
    }
  }

  } catch (error) {
    result.status = 'error';
    result.message = error.toString();
  }

  return createJsonResponse(result);
}

function createJsonResponse(data) {
  return ContentService.createTextOutput(JSON.stringify(data))
  .setMimeType(ContentService.MimeType.JSON);
}

5-3. Webアプリとしてデプロイする方法

ステップ1: デプロイメニューを開く

デプロイメニューを開く

コードを記述したら、次はWebアプリとしてデプロイします。

  1. スクリプトエディタの右上にある「デプロイ」ボタンをクリック
  2. 「新しいデプロイ」を選択

ステップ2: デプロイ設定

2: デプロイ設定
2: デプロイ設定
項目 設定値
種類の選択 ウェブアプリ
説明 任意(例:PubMed論文取り込みAPI)
次のユーザーとして実行 自分
アクセスできるユーザー 全員(外部から呼び出すため)

重要: 「アクセスできるユーザー」を「全員」に設定しないと、Difyから呼び出せません。

本ブログシリーズでは、簡易化のために「アクセスできるユーザー = 全員」にしました。しかし社内で実運用を行う場合には、全員がアクセスできる状態は許容できません。
簡易的な仕組みでは、呼び出し側(今回の場合Dify)と受け取り側(GAS)にのみ認証用の鍵をセットしておき、簡単な認証を行う方法があります。検証のために作成および公開したGASアプリなどはURLが外部に漏れないように注意しましょう。

ステップ3: デプロイ実行

  1. 「デプロイ」をクリック
  2. 初回実行時は、Googleアカウントでの承認フローが表示されます
承認フロー
  • 「アクセスを承認」をクリック
  • 必要に応じて、Googleアカウントの認証を完了

ステップ4: WebアプリのURLを取得

WebアプリのURLを取得

デプロイが完了すると、WebアプリのURLが表示されます。

<https://script.google.com/macros/s/xxxxxxxxxxxx/exec>

このURLをコピーしておきます。このURLが、DifyワークフローからPOSTする際のエンドポイントになります。

5-4. DifyでURLを設定

DifyでURLを設定

セクション3-2で解説した「GASに追記」ノード(HTTPリクエストノード)のURLに、取得したWebアプリのURLを設定します。

これで、Dify → GAS → スプレッドシートというパイプラインが完成します。

5-5. デプロイ時の注意点

項目 注意点
アクセス権限 外部から呼び出す場合は「全員」に設定。初回実行時、Googleアカウントの認証が必要な場合あり
コードの更新 コードを更新した場合は、新しいバージョンとしてデプロイが必要。「デプロイを管理」から新しいバージョンをデプロイ

6. 動作確認とプレビュー

GASのデプロイとDifyでのURL設定が完了したら、ワークフロー全体を動作確認してみましょう。

6-1. ワークフロー全体の動作確認

  1. Difyのチャット画面で、自然言語で論文検索クエリを入力
    • 例:「糖尿病のインスリン療法に関する2020年以降のRCT」
  2. ワークフローが実行され、以下の流れで処理が進みます
    • パラメータ抽出 → E-Search → E-Fetch → LLM処理 → CSV生成 → GAS送信 → スプレッドシート保存
  3. 結果として、スプレッドシートのURLが返されます
結果

7. まとめ

本記事(Part 4)では、Difyで生成したCSVデータをGoogle Apps Script(GAS)に送信してスプレッドシートへ保存する処理を、GASの基礎から実装手順、コード解説まで一通り解説しました。

本記事で実現したこと

  • Dify側の保存フロー: CSV生成ノードから直接GASに送信
  • GASの基礎知識: GASとは何か、その特徴とライフサイエンス業界での活用メリット
  • GASの実装手順: エディタの開き方からWebアプリのデプロイまで
  • GASコードの詳細解説: リクエスト受信からスプレッドシート保存までの処理フロー

Dify×GAS連携のポイント

ポイント 説明
シンプルな連携 DifyからHTTP  POSTでGASを呼び出すだけで、データの永続化が実現できる
直接的なデータフロー CSV生成ノードから直接GASに送信する単一経路のため、シンプルで理解しやすい
柔軟な拡張 GAS側で通知・定期実行・データ分析などの機能を追加できる
コスト効率 既存のGoogle  Workspace環境を活用し、追加コストを抑えられる

次のステップ

基本的な連携が完成したら、以下のような拡張も可能です。

  • メール通知: 重要な論文が追加されたら、関係者にメール通知
  • 定期実行: 毎日・毎週など、定期的に論文を自動収集
  • 複数シートへの振り分け: 研究テーマ別にシートを分けて管理
  • データ分析・可視化: グラフ作成やレポート自動生成

DifyとGASを組み合わせることで、ライフサイエンス・製薬業界の多様な課題に対応し、業務効率化とデータ管理の強化が期待できます。


シリーズ構成

  • Part0: 全体像とPubMed API基礎
  • Part 1: パラメータ抽出とE-Search編
  • Part 2: E-Fetchとデータパース編
  • Part 3: AI処理・データ整形編
  • Part4(本記事): データ保存とGAS連携編

連載シリーズ

Difyでつくる医学論文仕分けアプリ

全5回・PubMed API × Dify チャットワークフロー・GAS連携まで

  1. 全体像とPubMed API基礎
  2. パラメータ抽出とE-Search編
  3. E-Fetchとデータパース編
  4. AI処理・データ整形編
  5. データ保存とGAS連携編