Bloggerのページ一覧をGASで自動記入する

Bloggerの投稿一覧をGASで自動記入する」の続きです。

やったこと

前回、投稿一覧をGoogleスプレットシートに記載したため、次はページ一覧を別シートに記載します。

  1. スプレットシートに保存してあるデータを取得する
  2. BloggerAPIでページ一覧を取得する
  3. データとページ一覧から新規/更新/削除を行う
  4. スプレットシートに更新したデータを適用する

ソースコード

pages.gsvar key = '{BloggerAPIキー}';
var blogid = '{BloggerID}';
var sheetid = '{スプレッドシートID}';
// www.bugbugnow.netのドメインを要変更

// リストの値を更新する
function updateBlogListValues(type, values) {
  var ret = false;
  var list = [];
  var token = void 0;
  var isPost = (type == 'posts');

  do {
    // ページリストを取得
    var url = 'https://www.googleapis.com/blogger/v3/blogs/'+blogid+'/'+type;
    url += '?fetchBodies=false';
    url += '&maxResults=50';//500だとpostsでエラーする?//50で89が取れなかった。50+7しか収集しなかった。
    // 昼間は50件以上取得できない?
    url += '&orderBy=updated';
    url += (token)? '&pageToken='+token: '';
    url += '&key='+key;

    var fetchOptions = {
      method:"GET",
      headers:{
        Referer:'https://www.bugbugnow.net/',
      }
    };

    Logger.log('updateBlogListValues: '+url);
    var res = UrlFetchApp.fetch(url, fetchOptions);
    Utilities.sleep(5*1000);//5s
    var text = res.getContentText();
    var json = JSON.parse(text);
    res = text = null;

    // 終端の時(ちょうど終了の場合)
    if (!json.items) {
      break;
    }
    Logger.log('updateBlogListValues: '+json.items.length);

    // 挿入&更新
    for (var i=0; i<json.items.length; i++) {
      var item = json.items[i];
      var insert = true;
      for (var k=0; k<values.length; k++) {
        if (values[k][0] == item.url) {
          if (values[k][1] != item.updated) {
            values[k][1] = item.updated;
            values[k][2] = item.published;
            values[k][3] = item.title;
            if (isPost) {
              values[k][4] = item.labels.join(',');
            }
            ret = true;
            Logger.log('update: '+values[k][0]);
          }
          list[k] = true;
          insert = false;
          break;
        }
      }
      if (insert) {
        var value = [item.url, item.updated, item.published, item.title];
        if (isPost) {
          value.push(item.labels.join(','));
        }
        values.push(value);
        list[values.length-1] = true;
        ret = true;
        Logger.log('insert: '+values[values.length-1][0]);
      }
    }
    // 次のトークンがある場合、繰り返す
    token = json.nextPageToken;
  } while (token);

  // 削除
  for (var i=values.length-1; i>=0; i--) {
    if (list[i] !== true) {
      Logger.log('delete: '+values[i][0]);
      values.splice(i, 1);
      ret = true;
    }
  }
  return ret;
}

// リストを更新する
function updateBlogList(type) {
  Logger.log('updateBlogList: '+type);

  // スプレットシートの取得
  var isPost = (type == 'posts');
  var sheetApp = SpreadsheetApp.openById(sheetid);
  var sheet = sheetApp.getSheetByName(type);

  // A1=(1, 1)
  var row = sheet.getLastRow();
  Logger.log('row: '+row);
  var values = [];
  if (row > 1) {
    values = sheet.getRange(2, 1, row-1, (isPost? 5: 4)).getValues();
  }

  var ret = updateBlogListValues(type, values);
  if (ret) {
    // シートを更新
    values.sort(function(a, b) {
      return new Date(a[2]).getTime() - new Date(b[2]).getTime();
    });
    if (row > 1) {
      sheet.getRange(2, 1, row-1, (isPost? 5: 4)).clear();
    }
    sheet.getRange(2, 1, values.length, values[0].length).setValues(values);
    Logger.log('updateBlogList: update');
  }
}

// ページ一覧更新
function updatePage() {
  updateBlogList('pages');
}

完成品

Bloggerのページ一覧を下記のようにGoogleスプレットシートに記入できました。
ページ一覧