見出し画像

GASでnoteの投稿を取得する

GASでnoteの投稿を取得してスプレッドシートに出力するプログラムを作ってみたので、紹介します。
※非公式のAPIを使用するため、予期しないエラーが発生する可能性があります。

以下のような形式でスプレッドシートに投稿の一覧を出力します。

画像1

コードの全体

まず、コードの全体です。

function getNoteArticles() {
 const userName = "specially198";
 const url = `https://note.com/api/v2/creators/${userName}/contents?kind=note`;
 
 // APIで記事を取得する
 let jsonArticleInfo = UrlFetchApp.fetch(url, {'method':'get'});
 let articleInfos = JSON.parse(jsonArticleInfo.getContentText());

 let output = makeOutput(articleInfos.data.contents);

 // 記事数が2ページ以上ある場合は、総ページ数分、繰り返し処理する
 if (!articleInfos.data.isLastPage) {
   let page = 2;
   while(true) {
     jsonArticleInfo = UrlFetchApp.fetch(`${url}&page=${page}`, {'method':'get'});
     articleInfos = JSON.parse(jsonArticleInfo.getContentText());

     let tmp = makeOutput(articleInfos.data.contents);
     output = output.concat(tmp);
     if (articleInfos.data.isLastPage) {
       break;
     }
     page++;
   }
 }
 let sheetNoteArticleList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('note記事一覧');
 sheetNoteArticleList.getRange(2, 1, output.length, output[0].length).setValues(output);
}

function makeOutput(contents) {
 let output = [];
 for (let articleInfo of contents) {
   let row = [];
   row.push(articleInfo.noteUrl);
   row.push(articleInfo.name);

   output.push(row);
 }
 return output;
}

noteから投稿の一覧を取得する

まず、noteから投稿の一覧を取得します。
取得するには、以下のAPIを使用します。
https://note.com/api/v2/creators/[ここにユーザー名が入る]/contents?kind=note

以下の部分が該当部分です。

 const userName = "specially198";
 const url = `https://note.com/api/v2/creators/${userName}/contents?kind=note`;
 
 // APIで記事を取得する
 let jsonArticleInfo = UrlFetchApp.fetch(url, {'method':'get'});
 let articleInfos = JSON.parse(jsonArticleInfo.getContentText());

APIで取得した情報を加工する

取得した情報はスプレッドシートに出力する形式で加工しています。
取得した情報からURLとタイトルを使用しています。

以下の部分が該当部分です。

let output = makeOutput(articleInfos.data.contents);

function makeOutput(contents) {
 let output = [];
 for (let articleInfo of contents) {
   let row = [];
   row.push(articleInfo.noteUrl);
   row.push(articleInfo.name);

   output.push(row);
 }
 return output;
}

繰り返し処理をしてAPIを呼び出すようにする

APIでは一度に取得できる件数が決まっていて、それを超える分は繰り返し処理をして取得するようにしています。
以下のように、ページという概念になっています。
※画面で投稿の一覧を表示する時と同じ考え方で、「もっとみる」と同じ感じです。

「isLastPage」というプロパティで、最終ページかどうかが分かるので、最終ページになるまで繰り返しています。

以下の部分が該当部分です。

 // 記事数が2ページ以上ある場合は、総ページ数分、繰り返し処理する
 if (!articleInfos.data.isLastPage) {
   let page = 2;
   while(true) {
     jsonArticleInfo = UrlFetchApp.fetch(`${url}&page=${page}`, {'method':'get'});
     articleInfos = JSON.parse(jsonArticleInfo.getContentText());

     let tmp = makeOutput(articleInfos.data.contents);
     output = output.concat(tmp);
     if (articleInfos.data.isLastPage) {
       break;
     }
     page++;
   }
 }

スプレッドシートに出力する

最後にスプレッドシートに出力します。
シート名は「note記事一覧」としています。

以下の部分が該当部分です。

let sheetNoteArticleList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('note記事一覧');
sheetNoteArticleList.getRange(2, 1, output.length, output[0].length).setValues(output);

以下のような形式でスプレッドシートに出力できれば完了です。

画像1


この記事が気に入ったらサポートをしてみませんか?