const count = 5; // Укажите интересующие вас теги const excludedTags = ['#тема', '#тип']; let d = {}; const excludedFolder = '03 РАБОТА/КОНТАКТЫ'; // Убрали лишний "/" // Функция для проверки, содержит ли заметка хотя бы один из исключённых тегов function hasAnyExcludedTags(filePath, tagNames) { let fileCache = dv.app.metadataCache.getCache(filePath); if (!fileCache || !fileCache.tags) return false; // Извлекаем теги как массив значений let fileTags = fileCache.tags.map(tag => tag.tag); // Проверяем, если хотя бы один тег из excludedTags присутствует в заметке return tagNames.some(tagName => fileTags.some(fileTag => fileTag.startsWith(tagName)) ); } // Функция для проверки, находится ли файл в исключённой папке function isInExcludedFolder(filePath, folderPath) { return filePath.includes(folderPath); // Сравниваем путь без начального "/" } // Функция для обработки ссылок function process(k, v) { Object.keys(v).forEach(function (x) { let link_x = dv.fileLink(x); if (d[link_x] === undefined) { d[link_x] = []; } // Исключаем файлы, если они находятся в запрещённой папке или содержат исключённые теги if (!isInExcludedFolder(x, excludedFolder) && !hasAnyExcludedTags(x, excludedTags)) { d[link_x].push(dv.fileLink(k)); } }); } // Обрабатываем ссылки Object.entries(dv.app.metadataCache.resolvedLinks) .filter(([k, v]) => Object.keys(v).length) .forEach(([k, v]) => process(k, v)); // Выводим результат в таблицу dv.table(["Имя заметки", "Ссылаются"], Object.entries(d) .filter(([k, v]) => v.length >= count) .sort((a, b) => b[1].length - a[1].length) .map(([k, v]) => [k, v.join(" • ")]));