Skip to content

Instantly share code, notes, and snippets.

@mamoru0217
Last active January 11, 2018 01:56
Show Gist options
  • Save mamoru0217/968dfadc490e2e705858e8f4dc80e0d7 to your computer and use it in GitHub Desktop.
Save mamoru0217/968dfadc490e2e705858e8f4dc80e0d7 to your computer and use it in GitHub Desktop.
Facebook Page から投稿一覧を取得する Google App Script
var baseUrl = "https://graph.facebook.com/v2.11/"
var token = '' // tokenの取得方法は https://hirofukami.com/2017/06/30/facebook-page-access-token/ などを参考に

var postFieldList = [
  "created_time",
  "message",
  "permalink_url",
  "id",
  "promotion_status",
  "type",
  "shares"
]

var videoMetricList = [
  "post_reactions_by_type_total",
  "post_impressions",
  "post_impressions_unique",
  "post_video_views",
  "post_video_views_unique",
  "post_video_views_10s",
  "post_consumptions_by_type_unique"
]

function main() {
  var posts   = loadPosts('wowful.akstk')
  var result = []

  for(var x = 0; x < posts.length; x++) {
    var post     = posts[x]
    var response = fetch(
      baseUrl + post.id + "/insights" + metricParams('?') + tokenParams('&')
    )
    var postMetrics = response.data
    
    for (var i = 0; i < postMetrics.length; i++) {
      var metric = postMetrics[i]
      var val    = metric.values[0].value
      
      if (
        metric.name === "post_reactions_by_type_total" || 
        metric.name === "post_consumptions_by_type_unique"
      ) {
        var count = 0
        for (var n in val) {
          count += val[n]
        }
        post[metric.name] = count
      } else {
        post[metric.name] = val
      }
      
      if (postMetrics.length === i+1) {
        result.push(post)
      }
    }
  }
  
  var targetSheet   = getTargetSheet()
  var headerColumns = getHeaderColumns()
  targetSheet
    .clear() // 一旦すべての内容をクリアする
    .appendRow(headerColumns)
  
  for(var r in result) {
    var temp = []
    for(var attr in headerColumns) {
      Logger.log(headerColumns[attr])
      temp.push(result[r][headerColumns[attr]])
    }
    targetSheet.appendRow(temp)
  }
}

function getHeaderColumns() {
  var base = postFieldList.concat(videoMetricList)
  base.splice(base.indexOf('id'), 1)
  return base
}

function getTargetSheet() {
  var targetSheetId = '' // https://docs.google.com/spreadsheets/..?gid=xxx の値
  var spreadSheet = SpreadsheetApp.openById('hoge')
  var sheets = spreadSheet.getSheets()
  var targetSheet;

  for(var n in sheets){
    if(sheets[n].getSheetId()+'' == targetSheetId){ 
      targetSheet = sheets[n]
      break
    }
  }
  return targetSheet
}

function loadPosts() {
  var hasNextPage = true
  var url = baseUrl + "wowful.aktsk/posts" + tokenParams('?') + postFieldsParam('&')
  var res = []

  while (hasNextPage) {
    Utilities.sleep(1000)
    var response = fetch(url)
    var data     = response.data
    var paging   = response.paging
    
    for (var i = 0; i < data.length; i++) {
      var d = data[i]
      
      d.created_time = formatDateTime(d.created_time) // 2017/12/01 12:00:00という形式にする。
      
      try {
        d.shares = d.shares.count  // { share: { count: 100 } } という構造になっているのを取り出す。
      } catch(e) {
        d.shares = 0
      }
      
      res.push(data[i])
    }
    
    if (paging.next) {
      url = paging.next
      Logger.log(paging.next)
    } else {
      hasNextPage = false
    }
  }
  
  return res
}

function formatDateTime(str) {
  var date = new Date(str)
  var ymd  = [date.getYear(), date.getMonth(), date.getDay()].join('/')
  var time = [date.getHours(), date.getMinutes(), date.getSeconds()].join(':')
  return [ymd, time].join(" ")
}

function tokenParams(prefix) {
  return prefix + "access_token=" + token
}

function metricParams(prefix) {
  return prefix + "metric=" + videoMetricList.join(',')
}
              
function postFieldsParam(prefix) {
  return prefix + "fields=" + postFieldList.join(',')
}

function fetch(url) {
  return parseResponse(UrlFetchApp.fetch(url));
}

function parseResponse(response) {
  return JSON.parse(response.getContentText("UTF-8"));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment