新規投稿
フォローする

Googleスプレッドシートをグラフごとkintoneに移行

2021/02/14のアップデートアプリのグラフの設定を操作できる APIが追加されました. 今回はこちらを利用したサンプルをご紹介します.

サンプル

Googleスプレッドシートをグラフごとkintoneに移行します.

やりかた

Google App Scriptを利用します.

kintoneに移行したいGoogleスプレッドシートから,Google App Scriptのスクリプトエディタを開きます. 詳しくはこちらなどを参考にしてください.

スクリプトエディタに下記コードを貼り付け,main関数を実行します. 2~6,9行目はkintone設定に合わせて,適宜変更してください.

function kintoneApi(path, method, params) {
  const domain = '****.cybozu.com' //kintoneのドメイン
  const user = '****' //kintoneのログインユーザー名
  const password = '****' //kintoneのログインパスワード
  // const basicUser = '****' //kintoneのベーシック認証ユーザー名
  // const basicPass = '****' //kintoneのベーシック認証パスワード
  const headers = {
    'X-Cybozu-Authorization': Utilities.base64Encode(`${user}:${password}`),
    // 'Authorization': 'Basic ' + Utilities.base64Encode(${basicUser}:${basicPass}) //ベーシック認証ありの場合
  }
  const contentType = 'application/json'
  if(method === 'get') {
    return JSON.parse(UrlFetchApp.fetch(`https://${domain}${path}.json?${Object.entries(params).map(([key, value]) => `${key}=${value}`).join('&')}`, {
      method,
      headers
    }))
  }
  return JSON.parse(UrlFetchApp.fetch(`https://${domain}${path}.json`, {
    method,
    headers,
    contentType,
    payload: JSON.stringify(params)
  }))
}
function generateAppName(sheet) {
  return sheet.getName()
}
function generateProperties(sheet) {
  return sheet.getDataRange().getValues()[0].reduce((properties, field) => {
    properties[field] = {
      type: 'NUMBER',
      code: field,
      label: field
    }
    return properties
  }, {})
}
function generateReports(sheet) {
  return sheet.getCharts().map(chart => ({
    type: chart.modify().getChartType().toString(),
    title: chart.getOptions().get('title'),
    headers: chart.getRanges().map(range =>
      range.getValues()[0]
    ).flat()
  })).reduce((reports, chart, index) => {
    console.log(chart.title)
    reports[chart.title] = {
      chartType: chart.type,
      chartMode: 'NORMAL',
      name: chart.title,
      index,
      groups: [{
        code: chart.headers[0]
      }],
      aggregations: chart.headers.slice(1).map(header => ({
        type: 'SUM',
        code: header
      })),
      sorts: [{
        by: 'GROUP1',
        order: 'ASC'
      }]
    }
    return reports
  }, {})
}
function generateRecords(sheet) {
  const values = sheet.getDataRange().getValues()
  const fields = values[0]
  return values.slice(1).map(row =>
    fields.reduce((record, field, index) => {
      record[field] = {value: row[index]}
      return record
    }, {})
  )
}
function main() {
  const sheet = SpreadsheetApp.getActive().getActiveSheet()
  const app = kintoneApi('/k/v1/preview/app', 'post', {
    name: generateAppName(sheet)
  }).app
  kintoneApi('/k/v1/preview/app/form/fields', 'post', {
    app,
    properties: generateProperties(sheet)
  })
  kintoneApi('/k/v1/preview/app/reports', 'put', {
    app,
    reports: generateReports(sheet)
  })
  kintoneApi('/k/v1/preview/app/deploy', 'post', {
    apps: [{app}]
  })
  while(1) {
    if(kintoneApi('/k/v1/preview/app/deploy', 'get', {
      apps: app
    }).apps[0].status === 'SUCCESS'){
      break;
    } else {
      Utilities.sleep(1000)
    }
  }
  kintoneApi('/k/v1/records', 'post', {
    app,
    records: generateRecords(sheet)
  })
}

備考

  • Googleスプレッドシートのシート名が,kintoneのアプリ名に反映されます.
  • Googleスプレッドシート各グラフのタイトルが,kintoneのグラフ名に反映されます.
  • 「横棒グラフ」,「縦棒グラフ」,「折れ線グラフ」,「平滑線グラフ」,「面グラフ」,「円グラフ」,「表グラフ」のみに対応しています.
  • 「積み上げ表示」には対応しておりません.
0

0件のコメント

サインインしてコメントを残してください。