はじめに
ナレッジ共有ツールの移行のためにスクリプトを作成しました。
(画像は手で移行する必要があります)
利用しているものと大まかな流れについて
- 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);
}
参考