どうも。つじけ(tsujikenzo)です。このシリーズは「Google documentとスプレッドシートを連携しよう」ついてですが、今日は最終回【後編】をお届けします。
前回までのおさらい
前回は「スプレッドシートにdocumentの一覧を出力しよう」をお送りしました。
今回は最終回として「スプレッドシートからdocumentを生成」にチャレンジしてみたいと思います。
スプレッドシートに必要な要素を準備する
新規スプレッドシート[Create Document Sheet]を作成してコンテナバインドにコードを書いていきます。
documentを作成する為に最低限必要な情報は[タイトル][本文]ですね。後で使う可能性もあるので[No][option]という列も用意しました。
ひな型を用意する
今回はこのようなタイトルと本文のひな型を用意しました。A列は管理に便利なidとしたいため、ユニークな値を入力しましょう。
スプレッドシートの全体をオブジェクトとして取得する
配列型の2次元配列をオブジェクト形式に変換する便利な関数を使用します。後述します関数の全文をコピペしてスクリプトファイル[objChanger.gs]を作成して貼り付けておきましょう。
関数の全文はこちらです。
//グローバルエリア
const sheet = SpreadsheetApp.getActiveSheet();
const VALUES = sheet.getDataRange().getValues();
const HEADER = [...VALUES].shift();
//呼び出し
function callObjectChanger(){
const elementsArray = getElementsArray_();
console.log(elementsArray);
const elementsObject = getElementsObject_();
console.log(elementsObject);
}
/**
* オブジェクト群を配列で格納するパーツ
* @return {array} 配列 e.g[{id:’tg001’, name:’kenzo’},{},{}]
*/
function getElementsArray_() {
const elementsData = [];
for (const value of VALUES){
elementsData.push(getElementInfo_(value));
}
return elementsData;
}
/**
* オブジェクト群をオブジェクトで格納するパーツ
* @return {object} オブジェクト e.g{{id:’tg001’, name:’kenzo’},{},{}}
*/
function getElementsObject_() {
const elementsData = {};
for (const [i,value] of VALUES.entries()){
elementsData[VALUES[i][0]] = getElementInfo_(value);
}
return elementsData;
}
/**
* 1要素をオブジェクト化してくれるパーツ
* @param {array} values e.g [‘tg001’,’kenzo’]
* @return {object} オブジェクト e.g{id:’tg001’, name:’kenzo’}
*/
function getElementsInfo_(values) {
const object = {};
for(const [i, element] of HEADER.entries()){
object[HEADER[i]] = value[i];
}
return object
}
詳しくはこちらの記事を参照ください。
[タイトル][本文]をそれぞれ変数に格納する
const documents = getElementsObject_();
const doc001 = documents['doc001'];
console.log(doc001);
const title = doc001['タイトル'];
const body = doc001['本文'];
console.log(title);
console.log(body);
無事取り出せているようですね👏
タイトルを変更する
いろいろなやり方がありますが、せっかくdocumentを操作しているので、正規表現にも触れて見ましょう。タイトルや本文で使われているtitleという文字列を希望の値に置換します。正規表現の.replace()メソッドを使います。
const eventTitle = 'スプレッドシートの活用セミナー2020年11月';
const replacedTitle = title.replace(/title/g, eventTitle);
console.log(replacedTitle);
const replacedBody = body.replace(/title/g, eventTitle);
console.log(replacedBody);
変換できたようですね。
documentを作成する
ここまで来たら後はdocument APIの便利なメソッドを使って作成するだけです。以下のようなコードになります。
const doc = DocumentApp.create(replacedTitle);
doc.getBody().setText(replacedBody);
無事、マイドライブにdocumentが作成できているようですね👏👏👏
指定フォルダに移動
せっかくならdocumentの置き場所を移動したいです。documentのidを取得して移動しましょう。
const fileId = doc.getId();
const folderId = ‘移動先のフォルダID’;
const file = DriveApp.getFileById(fileId);
const folder = DriveApp.getFolderById(folderId);
file.moveTo(folder);
無事移動もできたようです。
まとめ
ちょっとあれもやりたいこれもやりたいって感じで盛り込んだので長くなってしまいましたが「スプレッドシートからdocumentを生成」をお送りしました。いかがでしたでしょうか。
もちろんfor文で回すとスプレッドシートにリスト化したデータを元にdocumentを大量に作成することもできますし、formから回答をもらって任意の値を使ってdocumentを発行するなんてこともできそうですね。