Googleクラウドサービスを利用して時間指定メール送信システムを作る（その４）

***
＜[前へ](http://qiita.com/matsuhandy/items/66fd2789e5a7c9d753fc)＞　＜[次へ](http://qiita.com/matsuhandy/items/396fb23cf5f270ea1726)＞
　書式設定をして解除するまでその設定が継続するように，Docクラスを改良してみます。
***
#1. ドキュメントに書き込む前に書式設定，書き込み後解除
* 例えば，次のようにして，アンダーラインを引きたい。

```java:アンダーラインをセットして文字を書いてアンダーラインを解除
  log.setUnderline(true);
  log.print("アンダーライン\n");
  log.setUnderline(false);
```

* つまり，次のように書くと

```java:書式設定
function main(){
  var log = new Doc(logID);
  log.clear();
  log.print("解答例です\n");
  
  log.setUnderline(true);
  log.print("アンダーライン\n");
  log.setUnderline(false);
  
  log.setBold(true);
  log.print("ボールド\n");
  log.setBold(false);
  
  log.setItalic(true);
  log.print("italic・イタリック\n");//全角文字ではイタリックにならないようだ
  log.setItalic(false);
  
  var bkup = log.getFontSize();
  log.setFontSize(20);
  log.print("フォントサイズ20\n");
  log.setFontSize(bkup);

  var bkup = log.getForegroundColor();
  log.setForegroundColor("#ff0000");//red
  log.print("赤色\n");
  log.setForegroundColor(bkup);
  
  var bkup = log.getBackgroundColor();
  log.setBackgroundColor("#ffff00");//yellow
  log.print("背景が黄色\n");
  log.setBackgroundColor(bkup);
  
}
```
* こんな風になって欲しい。
 
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/146927/9ad3f9b7-1594-6191-6f3c-92008980642d.png)

* GASのライブラリでは，ドキュメントのボディのテキストのx文字目からy文字目までアンダーラインを引く，というメソッドが用意されている。それを利用する。
* 次のGASプログラムを実行すると，上の実行結果になる。
* 複数の書式をセットしても反映される。
* **********は，logドキュメントのIDに置き換える。

```java:書式設定を追加したDocクラスの実行例プログラム
var logID = "**********";

function main(){
  var log = new Doc(logID);
  log.clear();
  log.print("解答例です\n");
  
  log.setUnderline(true);
  log.print("アンダーライン\n");
  log.setUnderline(false);
  
  log.setBold(true);
  log.print("ボールド\n");
  log.setBold(false);
  
  log.setItalic(true);
  log.print("italic・イタリック\n");//全角文字ではイタリックにならないようだ
  log.setItalic(false);
  
  var bkup = log.getFontSize();
  log.setFontSize(20);
  log.print("フォントサイズ20\n");
  log.setFontSize(bkup);

  var bkup = log.getForegroundColor();
  log.setForegroundColor("#ff0000");//red
  log.print("赤色\n");
  log.setForegroundColor(bkup);
  
  var bkup = log.getBackgroundColor();
  log.setBackgroundColor("#ffff00");//yellow
  log.print("背景が黄色\n");
  log.setBackgroundColor(bkup);
  
}

//////////Docクラスの定義開始（コンストラクタとメンバ関数で構成）
//Docクラスのコンストラクタの記述
Doc = function(id){
  this.ID = id;
  this.doc = DocumentApp.openById(this.ID); 
  this.body = this.doc.getBody();
  this.docText = this.body.editAsText();
  this.st = 0;//属性を適用する最初の文字start
  this.ed = 0;//属性を適用する最後の文字end
  this.bold = false;
  this.underline = false;
  this.italic = false;
  this.fontSize = this.docText.getFontSize();//デフォルトのフォントサイズをセット
  this.foregroundColor = this.docText.getForegroundColor();//デフォルトの文字色をセット
  this.backgroundColor = this.docText.getBackgroundColor();//デフォルトの背景色をゲット
}
//Docクラスのメンバ関数の定義開始
//メソッドprintの定義，テキスト追加
Doc.prototype.print = function(str){
  this.st = this.body.getText().length;//元の文字数
  this.docText.appendText(str);//文字数の追加
  this.ed += str.length;//追加後の文字数//this.ed = this.body.getText().length;でもよい

  this.docText.setBold(this.st,this.ed-1,this.bold);
  this.docText.setUnderline(this.st,this.ed-1,this.underline);
  this.docText.setItalic(this.st,this.ed-1,this.italic);
  this.docText.setFontSize(this.st,this.ed-1, this.fontSize);
  this.docText.setForegroundColor(this.st,this.ed-1, this.foregroundColor);
  this.docText.setBackgroundColor(this.st,this.ed-1, this.backgroundColor);
  
  this.st = this.ed;
}
//メソッドreplaceの定義，文字列置き換え
Doc.prototype.replace = function(src,dst){
  this.body.replaceText(src,dst);
}
//メソッドclearの定義，全消去
Doc.prototype.clear = function(){
  this.body.clear();
}
//メソッドgetIDの定義，ファイルIDを返す
Doc.prototype.getID = function(){
  return this.ID;
}
//メソッドsetBoldの定義
Doc.prototype.setBold = function(bold){
  this.bold = bold;
}
//メソッドsetForegroundColorの定義
Doc.prototype.setForegroundColor = function(color){
  this.foregroundColor = color;
}
//メソッドgetForegroundColorの定義
Doc.prototype.getForegroundColor = function(){
  return this.foregroundColor;
}
//メソッドsetBackgroundColorの定義
Doc.prototype.setBackgroundColor = function(color){
  this.backgroundColor = color;
}
//メソッドgetBackgroundColorの定義
Doc.prototype.getBackgroundColor = function(){
  return this.backgroundColor;
}
//メソッドsetFontSizeの定義
Doc.prototype.setFontSize = function(size){
  this.fontSize = size;
}
//メソッドgetFontSizeの定義
Doc.prototype.getFontSize = function(){
  return this.fontSize;//現在のフォントサイズをゲット
}
//メソッドsetUnderlineの定義
Doc.prototype.setUnderline = function(underline){
  this.underline = underline;
}
//メソッドsetItalicの定義
Doc.prototype.setItalic = function(italic){
  this.italic = italic;
}
//////////Docクラスの定義終了
```

* logを残すのにここまで凝る必要はないので，今後は次のクラスを使う。

```java:今後使うDocクラス
//////////Docクラスの定義開始（コンストラクタとメンバ関数で構成）
//Docクラスのコンストラクタの記述
Doc = function(id){
  this.ID = id;
  this.doc = DocumentApp.openById(this.ID); 
  this.body = this.doc.getBody();
  this.docText = this.body.editAsText();
}
//Docクラスのメンバ関数の定義開始
//メソッドprintの定義，テキスト追加
Doc.prototype.print = function(str){
  this.docText.appendText(str);
}
//メソッドreplaceの定義，文字列置き換え
Doc.prototype.replace = function(src,dst){
  this.body.replaceText(src,dst);
}
//メソッドclearの定義，全消去
Doc.prototype.clear = function(){
  this.body.clear();
}
//メソッドgetIDの定義，ファイルIDを返す
Doc.prototype.getID = function(){
  return this.ID;
}
```

***
　次回は，メール送信するプログラムを作ります。
＜[前へ](http://qiita.com/matsuhandy/items/66fd2789e5a7c9d753fc)＞　＜[次へ](http://qiita.com/matsuhandy/items/396fb23cf5f270ea1726)＞
***