0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DocBase→Notionへの移行

Posted at

はじめに

ナレッジ共有ツールの移行のためにスクリプトを作成しました。
(画像は手で移行する必要があります)

利用しているものと大まかな流れについて

  • Google Spead Sheet:DocBaseの情報をためるDBとして利用
  • Google Apps Script:データの取得やファイルへの書き込み
  • Google Drive:成果物になるMDファイルの置き場所

スクリプト構成

3つの関数で構成されています

  • fetchPostsOverview
    DocBaseからメモの概要を抽出してGoogle Spead Sheetに書き込みます
  • fetchPostsDetail
    取得したIDをもとにDocBaseから対応するメモの詳細を抽出してGoogle Spead Sheetに書き込みます
  • outputMarkdownFile
    Google Spead Sheetに書き出された情報をもとに指定されているGoogle Driveのフォルダにmdファイルを出力します

ソース

  • sheetName
  • docbaseToken
  • folderId
  • domain

上記の変数の値を指定してください。

//docbaseから取得した情報を書き込むシートの設定
const sheetName = "xxxx"
//docbaseのアクセストークン設定
const docbaseToken = "xxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
//mdの出力先Google DriveフォルダのID設定
const folderId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
//docbaseのドメインの設定
const domain = "xxxxxx"

const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(sheetName);

/**
 * docbaseの概要の抽出
 */
function fetchPostsOverview() {
  const url = "https://api.docbase.io/teams/" + domain + "/posts?p=100&per_page=100";
  const options = {
    "method": "GET",
    "headers": {
      "X-DocBaseToken": docbaseToken
    },
  };
  const response = UrlFetchApp.fetch(`${url}`, options);
  const jsonResponse = JSON.parse(response);
  //Logger.log(jsonResponse);
  var range = sheet.getRange('A2');
  jsonResponse.posts.forEach((post) => {
    range.setValue(post.title);
    range = range.offset(0, 1);
    range.setValue(post.id);
    range = range.offset(1, -1);
  });
}
/**
 * docbaseの詳細の抽出
 */
function fetchPostsDetail() {
  const url = "https://api.docbase.io/teams/" + domain + "/posts/";
  const options = {
    "method": "GET",
    "headers": {
      "X-DocBaseToken": docbaseToken
    },
  };
  //シート最終行の値を取得する
  const lastRow = sheet.getLastRow();
  //指定したセル範囲を取得する
  const rowRange = sheet.getRange(2, 2, lastRow - 1);
  //docのIDの二次元配列を取得
  const docIdArr = rowRange.getDisplayValues();
  var range = sheet.getRange('C2');

  docIdArr.forEach(function (value, index) {
    const docId = value[0];
    const response = UrlFetchApp.fetch(`${url}` + docId, options);
    const jsonResponse = JSON.parse(response);
    //Logger.log(jsonResponse);
    range.setValue(jsonResponse.body);
    range = range.offset(1, 0);
  });
}

/**
 * スプレッドシートの内容をドライブにMarkdownファイルとして出力
 */
function outputMarkdownFile() {
  let lastRow = sheet.getLastRow();
  let lastColumn = sheet.getLastColumn();
  var docbaseArr = sheet.getRange(2, 1, lastRow - 1, lastColumn).getDisplayValues();
  docbaseArr.forEach(function (value, index) {
    const fileName = value[0] + ".md";
    const docDetail = value[2];
    //Logger.log("[title] " + value[0] + "+\n[id] : " + value[1] + + "[Detail]" + value[2].slice(0, 15));
    _createMarkdownFile(folderId, fileName, docDetail);
  });
}

/**
 * Markdownファイル書き出し
 * @param {string} folderId フォルダID
 * @param {string} fileName ファイル名
 * @param {string} contents ファイルの内容
 */
function _createMarkdownFile(folderId, fileName, contents) {
  const contentType = 'text/markdown';
  const charset = 'UTF-8';
  const folder = DriveApp.getFolderById(folderId);
  const blob = Utilities.newBlob('', contentType, fileName).setDataFromString(contents, charset);
  folder.createFile(blob);
}


参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?