scrapboxのproject情報を一括して取得するUserScript
2021-06-19
21:57:07 includeJoined
が false
のときに重複を除けていなかった
15:55:57 データを取得できなかったproject(=存在しないか閲覧できないproject)は除くようにした
15:46:15 参加しているprojectのうち projectIds
にないprojectを除けるようにした
script.jsexport async function getProjectInfo(projectIds, {includeJoined = true} = {}) {
const chunkNum = Math.floor(projectIds.length / 100) + 1;
const result = await Promise.all([...Array(chunkNum).keys()]
.map(async index => {
const params = new URLSearchParams();
projectIds.slice(index * 100, 100 + index * 100).forEach(id => params.append('ids', id));
const res = await fetch(`/api/projects?${params.toString()}`);
const {projects} = await res.json();
return projects;
}));
const projects = result.flat();
if (includeJoined) {
// 重複を取り除く
const ids = [...new Set(projects.map(({id}) => id))];
return ids.map(id => projects.find(project => project.id === id));
} else {
// projectIdsにあるprojectのみ返す
return [...new Set(projects.map(({id}) => id))]
.filter(id => projectIds.some(_id => _id === id))
.map(id => projects.find(project => project.id === id));
}
}