質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

ドキュメント

ドキュメントは、IT用語では、ソフトウェアやハードウェアに関する情報であり、意図された目的、機能性、メインテナンスを含みます。ドキュメントは、多くの様々なフォームとフォーマットに存在しますが、その目的は常に教育することにあります。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

Q&A

解決済

1回答

4010閲覧

googleスプレッドシートとドキュメントを使用し、officeのExcelとwordの差込印刷をGASを使用し実行したい

Tsubanishi

総合スコア43

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

ドキュメント

ドキュメントは、IT用語では、ソフトウェアやハードウェアに関する情報であり、意図された目的、機能性、メインテナンスを含みます。ドキュメントは、多くの様々なフォームとフォーマットに存在しますが、その目的は常に教育することにあります。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

0グッド

1クリップ

投稿2020/11/18 15:13

googleのスプレッドシートに記入されている個人のデータをドキュメントに落として印刷したいと思っております
以前はofficeの差し込み印刷機能を利用していたのですが、現在googleのスプレッドシートやドキュメントを使用する機会が多くできればできればgoogleのGASコードを使用して実装したいと思っております
わかる範囲で書いたコードはこちらです

google

1function insertName(){ 2 3 const sheet = SpreadsheetApp.getActiveSheet(); 4 const lastRow = sheet.getLastRow(); 5 6 const DOC_URL = 'https://docs.google.com/document/d/1bb7Q7rrxL5rRjsnfALT9MGslGfHG7VMY/edit'; 7 const doc = DocumentApp.openByUrl(DOC_URL); 8 const docText = doc.getBody().getText(); 9 10 for(let i = 2; i <= lastRow; i++){ 11 12 const kana = sheet.getRange(i,1).getValue();//ふりがな 13 const name = sheet.getRange(i,2).getValue(); //名前 14 const type = sheet.getRange(i,3).getValue(); //タイプ 15 const alliance = sheet.getRange(i,4).getValue(); //提携先 16 const tel = sheet.getRange(i,5).getValue(); //電話番号 17 const mail = sheet.getRange(i,6).getValue(); //メールアドレス 18 const sex = sheet.getRange(i,7).getValue(); //性別 19 const year = sheet.getRange(i,8).getValue(); //年齢 20 const schoolyear = sheet.getRange(i,9).getValue(); //学年 21 const participationhistory = sheet.getRange(i,10).getValue(); //参加歴 22 const level = sheet.getRange(i,11).getValue(); //レベル 23 const brother = sheet.getRange(i,12).getValue(); //兄弟 24 const bus = sheet.getRange(i,13).getValue(); //バス希望 25 const busrute = sheet.getRange(i,14).getValue(); //バスルート 26 const busstop = sheet.getRange(i,15).getValue(); //停留所 27 const dm = sheet.getRange(i,16).getValue(); // DM希望 28 const body = docText 29 .replace('{ふりがな}',kana) 30 .replace('{名前}',name) 31 .replace('{タイプ}',type) 32 .replace('{提携先}',alliance) 33 .replace('{電話番号}',tel) 34 .replace('{メールアドレス}',mail) 35 .replace('{性別}',sex) 36 .replace('{年齢}',year) 37 .replace('{学年}',schoolyear) 38 .replace('{参加歴}',participationhistory) 39 .replace('{レベル}',level) 40 .replace('{兄弟}',brother) 41 .replace('{バス希望}',bus) 42 .replace('{バスルート}',busrute) 43 .replace('{停留所}',busstop) 44 .replace('{DM希望}',dm); 45 46 console.log(body); 47 48 } 49} 50google apps script 51```現在ログは出るのですがドキュメントへの書き込みコードと一括で全データを印刷してだす方法がわからず 52苦戦しております。どなたか教えていただけないでしょうか?? 53 54スプレッドシートはこちら 55https://docs.google.com/spreadsheets/d/124v0viFAxSvvAN9Zp3cv14V-p8_MmbxLCiPTUvfBx2g/edit#gid=0 56ドキュメントはこちら 57https://docs.google.com/document/d/1bb7Q7rrxL5rRjsnfALT9MGslGfHG7VMY/edit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • 共有している "https://docs.google.com/document/d/1bb7Q7rrxL5rRjsnfALT9MGslGfHG7VMY/edit" は .docx なので、このコードで「現在ログは出る」は偽です。
  • ドキュメントに出力するのであれば、直接 replaceText しないとフォーマットが崩れます。
  • Google Apps Script から直接プリンターに印刷命令をなげて、出力をさせることはできないと思います。ので、実行時の時刻のフォルダに document を作るようにしています。PDF になら出せるような気はします。
  • Promise にもしましたが、実行時間が短縮できませんでした。この 12 件のデータでおよそ 30 秒かかります。生徒の数が多くなると 5 分での完了が難しくなるかもです(PDF 化を付け足すとさらに時間がかかりますので)。

javascript

1function insertName(){ 2 const templateDocId = ""; 3 const keys = ['{ふりがな}','{名前}','{タイプ}','{提携先}','{電話番号}','{メールアドレス}','{性別}','{年齢}','{学年}','{参加歴}','{レベル}','{兄弟}','{バス希望}','{バスルート}','{停留所}','{DM希望}']; 4 5 const template = DriveApp.getFileById(templateDocId); 6 if(template.getMimeType() !== "application/vnd.google-apps.document") return; 7 const folder = DriveApp.createFolder((new Date()).toISOString()); 8 SpreadsheetApp.getActiveSheet().getDataRange().getValues().slice(1).forEach((r,i) => { 9 if(r[0] === "") return; 10 const body = DocumentApp.openById(template.makeCopy(`${r[0]} ${i}`,folder).getId()).getBody(); 11 keys.forEach((k,j)=>body.replaceText(k,r[j])); 12 }); 13}

投稿2020/11/22 14:14

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tsubanishi

2020/11/22 22:20

実装できました!! 有難う御座います。助かりました!!ただ印刷するとなると1件1件ドキュメントを開いて印刷しなくてはいけないですよね?これを一括で印刷できるいい方法は何かないでしょうか???
papinianus

2020/11/30 07:12

全く思いつきませんが、ブラウザを操作するツールをつくるか、EXCELに戻るか、ですかね。
sawa

2020/11/30 08:31

なんとなくですが、元のドキュメントの中身がtableなので、印刷用に新しくドキュメントを作成して、そこに取得したtableをappendTableで追加 → キーを置き換え をひたすら forループで繰り返すと、後で一気に印刷できるドキュメントが作成できそうな気がします。
Tsubanishi

2020/12/02 00:33

@papinianusさん。現在googleドキュメントファイルにてデータができますが、これってpdfでファイルごとに出すことはできますか? pdfなら一気に印刷できそうなのですが。https://dekiru.net/article/18116/ コードの if(template.getMimeType() !== "application/vnd.google-apps.document") return; 上記あたりを変えればいけますでしょうか?
papinianus

2020/12/02 07:14

sawa 様 その方法は考えつかなかったですね。一つの解決策にはなり得ると思います。ただ、コード的にはけっこう面倒な気がします。(document をあまり gas でさわったことないので) Tsubanishi 様 pdf にすることはできると思いますが、そこをかえても無意味ですね。spreadsheet を pdf にしたことはあるのですが、調べないとやりかたが分からないです。
sawa

2020/12/02 09:15 編集

papinianus様 document に関する gasの情報は、日本語だと特にないですよね。。 既にクローズしている質問ではありますが、一応蛇足までに案をpapinianus様のをベースにコードにしてみました。私はあんましモダンカッコいい記述はできませんが・・・。 function insertName2(){ const templateDocId = ""; const keys = ['{ふりがな}','{名前}','{タイプ}','{提携先}','{電話番号}','{メールアドレス}','{性別}','{年齢}','{学年}','{参加歴}','{レベル}','{兄弟}','{バス希望}','{バスルート}','{停留所}','{DM希望}']; const template = DriveApp.getFileById(templateDocId); if(template.getMimeType() !== "application/vnd.google-apps.document") return; const table = DocumentApp.openById(templateDocId).getBody().getTables()[0]; const folder = DriveApp.createFolder((new Date()).toISOString()); const printfileID = template.makeCopy("印刷用", folder).getId(); const printDoc = DocumentApp.openById(printfileID); const body = printDoc.getBody() const data = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); for(i=1; i<data.length; i++){ body.appendTable(table.copy()); keys.forEach((k,j)=>body.replaceText(k,data[i][j])); }; }
Tsubanishi

2020/12/04 05:55

SAWA様 コードありがとうございます。ドキュメントの1つのファイルにデータが入ってきました!! for文で繰り返すのですね。思いつかなかった。これで印刷すれば一括で出るような気がします
Tsubanishi

2020/12/15 15:23

sawa様 たびたびすいません。いただいたコード実装できたのですが、よくよく見るとスプレッドシートの1番はじめのデータが2つドキュメントに出てしまうのですが、直す方法はありますでしょうか?
sawa

2020/12/16 00:08

解決済みのコメント欄で追加質問はよろしくないです。 そもそも、私のは単なるコメントですし、papinianusさんにも通知が飛んでご迷惑がかかります。 1番はじめのが2つできてしまうのは、印刷用ドキュメントを作成する際にコピーで作ってしまったからです。そのままforループで表を追加してから置換が走るので、初回だけ表2つ分に1番目のデータが置換されちゃってます。失礼しました。修正するには、印刷用ドキュメントをコピーじゃなくて真っ新な新規作成すれば良いです。 この場でのやりとりは、以上で終了とさせてください。行き詰ったら別質問としてください。
Tsubanishi

2020/12/16 06:48

何も知らず大変失礼いたしました。 ご迷惑をおかけして大変申し訳ございませんでした
papinianus

2020/12/17 15:09

いえいえ、解決策の引き出しもらってありがたさしかないです。気にせずバンバンやりとりして…、というのは今度はsawa様に負担ですね。 今度ちゃんと書いてみますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問