どうも。つじけ(tsujikenzo)です。このシリーズでは「業務マニュアルとアセスメントシートを(同時に)作ろう」についてお送りしています。全7回の予定で、今日は第7回目の最終回です。
前回のおさらい
スタンドアロンスクリプトにコードを作成してきました。説明は割愛しましたが、「CreateAssessmentSheet」としてライブラリ化も行いました。
[document][GAS]業務マニュアルとアセスメントシートを作ろう-その6-
どうも。つじけ(tsujikenzo)です。このシリーズでは「業務マニュアルとアセスメントシートを(同時に)作ろう」についてお送りしています。全7回の予定で、今日は第6回目です。前回のおさらい前回は、「ドキュメントからスプレッ...
最終回は「CreateAssessmentSheet」のマニュアルをご紹介させていただきます。
Overview
CreateAssessmentSheet 1.0
(c) 2020-2021 Kenzo Tsuji all rights reserved
GitHub Repository
coming soon
Introduction
This library creates a spreadsheet that lists the title and paragraphs in a Google Docs.
Sample Document
Create Spreadsheet
You can specify a folder to save the spreadsheet.Pass the Google drive folder ID as an argument.
Script ID
Script ID : 1Dd9d99GQIUy0z130EGUPDj5udlFYDqnYwQRLU5qAAW_IoZ8nJ_kZZVuD
Methods
.createcreateAssessmentSheet(Document ID, Folder ID)
@param{string} Document ID
@param{string} Folder ID
@Returns {object} Spreadsheet Object
const docId = 'Document ID';
const folderId = 'Folder ID';
CreateAssessmentSheet.createAssessmentSheet(docId , folderId);
README File
coming soon
Sources
/**
* ドキュメントから新規スプレッドシートを作成する
*
* @param {string} ドキュメントID
* @param {string} スプレッドシートの保存先フォルダID
*/
function createAssessmentSheet(docId, folderId){
//引数が無い時は下記2行をコメントインしてください
//docId = 'マニュアルのドキュメントID';
//folderId = '保存先のドライブID';
const array = documentConverter_(docId);
cosnt ss = createSS_(array[0], array[1], folderId)
let [arg1, arg2, arg3, arg4, arg5] = ['#073763','#000000','#000000','#ffffff','#f3f3f3'];
const backGroundColors= setConditionalFormatRule_(ss, arg1, arg2, arg3, arg4, arg5);
[arg1, arg2, arg3, arg4, arg5] = ['#ffffff','#ffffff','#ffffff','#000000','#000000'];
const fontColors = setConditionalFormatRule_(ss, arg1, arg2, arg3, arg4, arg5);
[arg1, arg2, arg3, arg4, arg5] = ['bold','normal','normal','normal','normal'];
const fontWeights = setConditionalFormatRule_(ss, arg1, arg2, arg3, arg4, arg5);
[arg1, arg2, arg3, arg4, arg5] = ['left','left','left','left','left'];
const alignments = setConditionalFormatRule_(ss, arg1, arg2, arg3, arg4, arg5);
ss.getActiveSheet().getRange(1, 1, backGroundColors.length, backGroundColors[0].length)
.setBackgrounds(backGroundColors)
.setFontColors(fontColors)
.setFontWeights(fontWeights)
.setHorizontalAlignments(alignments);
return ss;
}
/**
* ドキュメントIDを渡すと2次元配列を返す
*
* @param {string} ドキュメントトID
* @return {array} [title,2次元配列,
*/
function documentConverter_(id){
const doc = DocumentApp.openById(id);
const title = doc.getName();
const array = [['Style', 'No', 'Heading'],['TITLE','',title]];
const paragraphs = doc.getBody().getParagraphs();
for (const parag of paragraphs) {
const style = parag.getHeading().toJSON();
switch (style) {
case 'HEADING2':
array.push([style, '', parag.getText()]);
break;
case 'HEADING3':
array.push([style, '', parag.getText()]);
break;
case 'HEADING4':
array.push([style, '', parag.getText()]);
break;
default:
}
}
return [title, array];
}
/**
* ドキュメントを変換した2次元配列から新規スプレッドシートを作成する
*
* @param {string} ドキュメントのタイトル
* @param {array} ドキュメントの2次元配列
* @param {string} 保存先のフォルダID
* @return {object} 新規作成したスプレッドシートオブジェクト
*/
function createSS_(title, array, folderId){
const ss = SpreadsheetApp.create(title);
const SSID = ss.getId();
const file = DriveApp.getFileById(SSID);
const folder = DriveApp.getFolderById(folderId);
file.moveTo(folder);
ss.getActiveSheet().getRange(1,1,array.length, array[0].length).setValues(array);
//[No]列を補完する
array = setParagraphNumbers_(SSID);
ss.getActiveSheet().getRange(1,1,array.length, array[0].length).setValues(array);
return ss;
}
/**
* スプレッドシートオブジェクトを渡すとNoを補完した2次元配列を返す
*
* @param {object} スプレッドシート
* @return {array} Noを補完した2次元配列
*/
function setParagraphNumbers_(ss) {
let titles = ss.getActiveSheet().getDataRange().getValues();
//empty array
const addNums = [];
//count var
let countHeading2 = 0;
let countHeading3 = 0;
let countHeading4 = 0;
//def flag
let flag1 = false;
let flag2 = false;
let flag3 = false;
let flag4 = false;
for (const title of titles) {
//set a flag on
switch (title[0]) {
case 'TITLE':
flag1 = true;
break;
case 'HEADING2':
if (flag2 === false && flag3 === false && flag4 === false) flag2 = true;
if (flag2 && flag3 && flag4 === false) {
countHeading3 = 0;
flag3 = false;
}
if (flag2 && flag3 && flag4) {
countHeading3 = 0;
countHeading4 = 0;
flag3 = false;
flag4 = false;
}
break;
case 'HEADING3':
if (flag2 && flag3 && flag4) {
countHeading4 = 0;
flag4 = false;
}
flag3 = true;
break;
case 'HEADING4':
flag4 = true;
break;
}
if (flag1) addNums.push(['1']);
flag1 = false;
//append nums
if (flag2 && flag3 === false && flag4 === false) {
countHeading2++;
addNums.push([`1.${countHeading2}`]);
}
if (flag2 && flag3 && flag4 === false) {
countHeading3++;
addNums.push([`1.${countHeading2}.${countHeading3}`]);
}
if (flag2 && flag3 && flag4 === true) {
countHeading4++;
addNums.push([`1.${countHeading2}.${countHeading3}.${countHeading4}`]);
}
}
titles.shift();
titles = titles.map((element, index) => [element[0], addNums[index][0], element[2]]);
titles.unshift(['Style', 'No', 'Heading']);
return titles;
}
/**
* セルの書式設定の要素を持つ2次元配列を返す
*
* @param {object} スプレッドシートオブジェクト
* @param {string} Styleの書式設定
* @param {string} TITLEの書式設定
* @param {string} HEADING2の書式設定
* @param {string} HEADING3の書式設定
* @param {string} HEADING4の書式設定
* @return {array} 2次元配列
*/
function setConditionalFormatRule_(ss, arg1, arg2, arg3,arg4, arg5){
const values = ss.getActiveSheet().getDataRange().getValues();
let copy = '';
const rules = values.map(record => record.map(element => {
switch (record[0]) {
case 'Style':
copy = arg1;
break;
case 'TITLE':
copy = arg2;
break;
case 'HEADING2':
copy = arg3;
break;
case 'HEADING3':
copy = arg4;
break;
case 'HEADING4':
copy = arg5;
break;
}
return copy;
})
);
return rules;
}
まとめ
以上で、[CreateAssessmentSheet ver1.0]のマニュアルになります。ライブラリのバージョンは常に最新版をお使いください。今後とも末永くよろしくお願いいたします。