ObsidianとZoteroで文献整理。ユーザースクリプト

ユーザースクリプトの使い方の概要

Zoteroから文献ノートを作る時に画像の添付は通常のTemplateではできないと思っていたので、ユーザースクリプト書いてやっていたんですが、この記事を公開する直前にRedditに簡単な画像添付のしかたが紹介されていたので、ユーザースクリプトは不要でした。

他の用途でユーザースクリプトの使うこともあるかもしれないので、記録として残しておきます。

ユーザースクリプトはJavaScriptで書かれたコードでTemplaterなどのプラグインから呼び出します。

templateの中に下記のコードを入れるとinsertImageという関数をユーザースクリプトから呼び出すことができます。

<%* tp.user.insertImage(tp) %>

ユーザースクリプトは後述しますがTemplaterで設定した場所に保存します。

Zotero Integrationの設定

フォルダ構造は前述の記事の通りです。

Vault
  ├── Project 1
  ├── Literature
  │         └── Inbox      (論文ノートが保存されます)
  ├── Templates            (テンプレートを保存します)
  │         └── Scripts    (画像をノートに添付するスクリプトを保存します)
  └── Attachments          (画像が保存されます)
        

Zotero Integrationの設定は前述の記事の通りです。

Import Format
Name           (コマンド・パレットで呼び出す時に使う名前です。他の名前でも構いません)
  Import note from zotero
Output Path        (文献ノートの保存場所と保存名の形式を指定しています)
  Literature/Inbox/{{date | format("YYYY-MM")}} {{creators[0].lastName}} {{creators[0].firstName[0]}}.md
Image Output Path   (添付画像の保存先を指定しています)
  Attachments/{{date | format("YYYY-MM")}} {{creators[0].lastName}} {{creators[0].firstName[0]}}/
Template        (テンプレートファイルを指定しています)
  Template/Zotero_Template.md

下のテキストはテンプレートです。コピーしてZotero_Template.mdとして保存して、Templatesのフォルダに入れます。

最後の行にユーザースクリプトを呼び出すコードが入っています。

---
category: literaturenote
tags: {% if allTags %}{{allTags}}{% endif %}
citekey: {{citekey}}
rating:
---
*{{publicationTitle}}*
{{title}}
# Summary

> [!My note]
> Synopsis::
# Methods

# Results

## PDF
  {%- for attachment in attachments | filterby("path", "endswith", ".pdf") %}
  [{{attachment.title}}](file://{{attachment.path | replace(" ", "%20")}}) {%- endfor -%}.
## Abstract
  {%- if abstractNote %}
  {{abstractNote}}
  {%- endif -%}.
## Metadata
{% for type, creators in creators | groupby("creatorType") -%}
{%- for creator in creators -%}
**{{"First" if loop.first}}{{type | capitalize}}**::
{%- if creator.name %} {{creator.name}}
{%- else %} {{creator.lastName}}, {{creator.firstName}}
{%- endif %}
{% endfor %}
{%- endfor %}
**Title**:: {{title}}
**Year**:: {{date | format("YYYY-MM")}}
**Citekey**:: {{citekey}} {%- if itemType %}
**itemType**:: {{itemType}}{%- endif %}{%- if itemType == "journalArticle" %}
**Journal**:: *{{publicationTitle}}* {%- endif %}{%- if volume %}
**Volume**:: {{volume}} {%- endif %}{%- if issue %}
**Issue**:: {{issue}} {%- endif %}{%- if itemType == "bookSection" %}
**Book**:: {{publicationTitle}} {%- endif %}{%- if publisher %}
**Publisher**:: {{publisher}} {%- endif %}{%- if place %}
**Location**:: {{place}} {%- endif %}{%- if pages %}
**Pages**:: {{pages}} {%- endif %}{%- if DOI %}
**DOI**:: {{DOI}} {%- endif %}{%- if ISBN %}
**ISBN**:: {{ISBN}} {%- endif %}{%- if desktopURI %}
**DesktopURI**:: [zotero-link]({{desktopURI}}){%- endif %}

> **Related**:: {% for relation in relations | selectattr("citekey") %} [[@{{relation.citekey}}]]{% if not loop.last %}, {% endif%} {% endfor %}

> {%- if markdownNotes %}
> {{markdownNotes}}{%- endif -%}.

<%* tp.user.insertImage(tp) %>
Templaterの設定

Templaterの設定は以下の通りです。

Template folder location:
  Templates
User script functions
  Script files folder location:
    Templates/Scripts

下のテキストは画像を文献ノートに添付するスクリプトです。テキストをコピーしてinsertImage.jsとして保存して、Templates/Scriptsのフォルダに入れます。このファイル操作はObsidian上ではなくOSのファインダ・エクスプローラでやるのがいいと思います。Obsidian上では.mdや画像ファイル以外は隠しファイルになっているようです。

async function insertImages(tp) {
  const files = app.vault.getFiles();
  let imageLinks = '';
  files.forEach(file => {
    if (file.path.includes(tp.file.title) && file.path.endsWith(".png")) {
      console.log(file.path);
      const imageLink = `![[${file.path}]]\n`;
      imageLinks += imageLink;
      console.log(imageLinks);
    }
    if (file.path.includes(tp.file.title)
      && file.path.endsWith(".md")
      && file.path.includes("Inbox")) {
      console.log(file.path);
      mdFile = file;
    }
  });
  if (mdFile) {
    const fileContent = await app.vault.read(mdFile);
    await app.vault.modify(mdFile, fileContent + imageLinks);
    console.log("Image Inserted.");
  } else {
    console.error("Markdown file not found.");
  }
}
module.exports = insertImages;

Templaterの設定のページに戻ってUser script functionsのところで"Detected 1 user script"と表示されているのを確認してください。

Zotero Integrationの使い方

Zoteroの文献ノートの取り込みは前述の通りコマンドパレットから呼び出します。

Zotero Integrationの苦労話

Zotero Integrationの設定で画像を取り込んで直接ノートに添付するやり方が通常のtemplateでのやり方が分からなく、ユーザースクリプトを用いて実装したんだけど、実装し終わった次の日にRedditでtemplateでのやり方が紹介されたので、せっかく苦労して書いたユーザースクリプトが没になりました。

せっかくなので、ユーザースクリプトでのやり方を記録として残しておきます。

コードで苦労した原因は下のコードが正しく動かなかったためです。copilot, gemini, chatGPTに聞いても分からなく、相当な時間を溶かしました。

const files = app.vault.getAbstractFileByPath('path_to_folder')

Zoteroからの文献ノートを取り込む際に画像は所定の場所に保存されるようになっています。ファイル名自体はわからない状態です。保存されている場所をpath_to_folderを入れると画像ファイル名を返すはずなのですが、、、nullが返ってきます。

しょうがないので、getFiles()を使ってVault内の全ファイル名を取得して、その後ループを回してスキャンしてpath_to_folderのフォルダ名が入っているファイル名を取得する姑息的なやり方で解決しました。

const files = app.vault.getFiles();

最終更新日:2025年3月22日