DocBase→Notionへの移行

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

# 利用しているものと大まかな流れについて
 - 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 

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

```javascript
//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);
}


```
# 参考
https://help.docbase.io/posts/45703

https://qiita.com/Z-me/items/575cdd6f7903043382cb

https://blog.take-it-easy.site/gas/gas-output-textfile/