GAS による Googleドキュメントの操作


## この記事について
GASでGoogleドキュメントを操作する時の良く使う構文の個人的メモです。
より詳細な解説は下記の記事にまとめています。

https://www.teijitaisya.com/gas-googledocument/


## 基本構文

DocumentAppの下にbodyがあって、Paragraph（パラグラフ：段落）がある。Paragraphの中に文章（text）だったり、表だったり画像がある。

基本的にテキストの操作はParagraph単位で行う


### ドキュメントを開く

```javascript
//Googleドキュメントを開く
var doc = DocumentApp.openById("ID");
var doc = DocumentApp.openByUrl("url");
```


### テキストを編集する

```javascript
var paragraphs = body.getParagraphs();
var p1 = paragraphs[0]

//段落にテキストを挿入する。
p1.insertText( 0, "text" );
//段落にテキストを追加する。
p1.appendText("text");
```

### ドキュメントを保存する
Goolgeドキュメントは基本的に即自的に変更が確定されるが、GASで操作する時はsaveしないと変更が確定しないことがあるので変更したら明示的に保存した方が良い。

```javascript
  var doc = DocumentApp.openById(file.id);
  doc.saveAndClose();
```


## よく使う処理





### 指定のフォルダに新規Googleドキュメントを作成する

```javascript
  var folder = DriveApp.getFolderById("folderId"); 
  var doc = DocumentApp.create("doc name");
  var docFile = DriveApp.getFileById(doc.getId()); 
  folder.addFile(docFile);
```

### 文章の最後に文章を追記する

```javascript
  var body = DocumentApp.getActiveDocument().getBody();
  
  body.appendPageBreak();//ページ区切りを入れる
  body.appendParagraph("hogehoge");//段落をアペンドする
```

### 文章の最初に文章を挿入する

```javascript
  var body = DocumentApp.getActiveDocument().getBody();
  body.insertParagraph(0, "hogehoge"); //段落番号を0が文章の最初

```

### 段落ごとに処理する

```javascript
  //段落ごとに翻訳してみる。
  var body = DocumentApp.getActiveDocument().getBody();
  var paragraphs = body.getParagraphs();
  var textBefore ; // 翻訳前テキスト
  var textTranslated ; // 翻訳後テキスト
  paragraphs.forEach( p => {
    textBefore = p.getText();
    if (textBefore != ""){
      textTranslated = LanguageApp.translate(textBefore, "ja", "en");
      p.setText(textTranslated);
    };
```

### 表を差し込む

```javascript

function createDoc() {
  var doc = DocumentApp.create('Sample Document');
  var body = doc.getBody();
  var rowsData = [['Plants', 'Animals'], ['Ficus', 'Goat'], ['Basil', 'Cat'], ['Moss', 'Frog']];
  body.insertParagraph(0, doc.getName())
      .setHeading(DocumentApp.ParagraphHeading.HEADING1);
  table = body.appendTable(rowsData);
  table.getRow(0).editAsText().setBold(true);
}
```

### 文字列置換・テンプレート文章の置換
テンプレートを用意しておき、文字列置換で文章を作成する時に便利

```javascript
/*
/テンプレートとなるGdocファイル新規作成する
*/
function createTemplate() {
  var body = DocumentApp.getActiveDocument().getBody();
  //置換用文字列
  body.appendParagraph('{name}');
  body.appendParagraph('{address}');
  body.appendParagraph('{city} {zip}');
}

/*
/上で作成したテンプレートの置換用文字列を指定の文字列に置換する
*/
function searchAndReplace() {
  var body = DocumentApp.getActiveDocument()
      .getBody();
  var client = {
    name: 'お客様　タロウ',
    address: '新宿',
    city: '東京',
    zip: 'xxx-xxxx'
  };

  body.replaceText('{name}', client.name);
  body.replaceText('{address}', client.address);
  body.replaceText('{city}', client.city);
  body.replaceText('{zip}', client.zip);
}
```

### 現在のカーソル位置に文章を挿入する

```javascript
  var doc = DocumentApp.getActiveDocument();
  doc.getCursor().insertText(text);
  //getcusorはアクティブドキュメントにしか使用できない
```

### ファイル名操作

```javascript
  var doc = DocumentApp.getActiveDocument();
  doc.getBlob().getName(); //拡張子あり。
  doc.getName(); //上と一緒。拡張子なし。
```



# 参考

- [(公式)Google Document オブジェクトの階層構造とか](https://developers.google.com/apps-script/guides/docs#replace-the-placeholders)

- [(libro)www.tuyano.com](https://www.tuyano.com/index3?id=675001&page=1)