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

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

新規登録して質問してみよう
ただいま回答率
85.37%
印刷

印刷とは、インキを用いて紙などの被印刷物に機械的に複製することを指します。現在は紙などの2次元の媒体だけでなく、3次元の曲面にも直接印刷する技術など様々な開発が進んでいます。

Google スプレッドシート

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

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

ドキュメント

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

Google

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

Q&A

解決済

1回答

9692閲覧

googleスプレッドシートとドキュメントを使用し、差込印刷をGASを使用し申込書を作成

Tsubanishi

総合スコア43

印刷

印刷とは、インキを用いて紙などの被印刷物に機械的に複製することを指します。現在は紙などの2次元の媒体だけでなく、3次元の曲面にも直接印刷する技術など様々な開発が進んでいます。

Google スプレッドシート

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

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

ドキュメント

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

Google

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

0グッド

2クリップ

投稿2021/03/18 15:28

編集2021/03/30 07:32

googleスプレッドシートとドキュメントを使用し、officeのExcelとwordの差込印刷をGASを使用し申込書を作成しました。スプレッドシートの一覧は写真①の感じです
写真①
これを下記のコードでドキュメントに写し申込書を作成しています

Google

1function insertName2(){ 2const templateDocId = "××××××××××××××××××××××××××××××××××××"; 3const keys = ['{ふりがな}','{名前}','{性別}','{学年}','{年齢}','{種別}','{電話番号}','{施設}','{レベル}','{バス希望}','{バスルート}','{バス停留所}']; 4 5const template = DriveApp.getFileById(templateDocId); 6if(template.getMimeType() !== "application/vnd.google-apps.document") return; 7 8const table = DocumentApp.openById(templateDocId).getBody().getTables()[0]; 9 10const folder = DriveApp.createFolder((new Date()).toISOString()); 11const printfileID = template.makeCopy("印刷用紙", folder).getId(); 12 13 14const printDoc = DocumentApp.openById(printfileID); 15const body = printDoc.getBody() 16const data = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); 17 18for(i=1; i<data.length; i++){ 19keys.forEach((k,j)=>body.replaceText(k,data[i][j])); 20 if (i < data.length - 1){ 21 body.appendTable(table.copy()); 22 body.appendPageBreak(); 23 } 24}; 25 26}

そうするとドキュメントの1枚目の写真のようにデータが入ります1枚目の写真
11件データがドキュメントに反映される予定ですが、2枚目以降、写真2のように領収書部分がなぜか出ません。

写真2
以前別のデータで試した際はうまく申込書の領収書部分も全てのドキュメントで出たのですが
コードがおかしいのでしょうか?困っております。

スプレッドシートURL https://docs.google.com/spreadsheets/d/18_e2MtWAGXM-eH_PcOYFTngFdkbqirMHD23DWaCflWE/edit?usp=sharing

ドキュメントURL  https://docs.google.com/document/d/1pxHdAuTfRzMultE8Akgwl96eqR07OWnTmbRYR9RRsVE/edit?usp=sharing

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

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

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

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

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

guest

回答1

0

ベストアンサー

一件目は、テンプレートをコピーしているのが出力されています、

2件目以降は、処理で追加しているようですが

const table = DocumentApp.openById(templateDocId).getBody().getTables()[0];

body.appendTable(table.copy());

これで一つ目の表部分をアペンドしています。
ですが、一つ目の表の部分に領収書部分が含まれていないため
領収書部分が追加されないようです。

領収書部分も一つ目の表の中に入れればよいかと思います。
もし分けたいのであれば、2個目の表として追加する方法もあるかと思います。

ただ、表の修正って大変ですね。。。

投稿2021/04/01 22:32

編集2021/04/01 23:01
xail2222

総合スコア1508

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

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

Tsubanishi

2021/04/02 06:01

xail2222様 有難うございます。理解ができました。しかし、表1つの中に領収書等は入れることができず、2つに分けようと思うのですが2つ目の表をアペンドする場合どのようなコードを記入すれば良いのでしょうか?素人ですいません。table2とかにして、body.appendTable(table2.copy()); みたいな感じでしょうか?
xail2222

2021/04/02 20:07 編集

まずは、ドキュメントの領収書部分を枠線のない表に埋め込むか、新たな表をつくって その後、コードの方で const table2 = DocumentApp.getActiveDocument().getBody().getTables()[1]; とかやると2番目のテーブルが取れるので、その後は提示の通り body.appendTable(table2.copy()); みたいな感じで行けると思います。確か昨日ためしたら出来た気がします。 table以外をつかってどうやるのかは 私もまだ調査中です…
Tsubanishi

2021/04/03 10:30

すいません8行目の const table = DocumentApp.openById(templateDocId).getBody().getTables()[0];の コードの後に const table = body.appendTable(table.copy()); const table2 = DocumentApp.getActiveDocument().getBody().getTables()[1]; const table2 = body.appendTable(table2.copy()); 3行を追加してみたところ SyntaxError: Identifier 'table' has already been declared(行 9、ファイル「print_ok.gs」) とでてしまったのですがどういう意味のエラーでしょうか? なんどもすいません。できたらxail2222様の追記したコードを教えていただければと思います
xail2222

2021/04/04 10:29 編集

まずエラーの原因ですが const table = ~; const table = ~; と同じ変数に対して変数宣言を二回しているからエラーになっています。 変数宣言した後は、その宣言した変数を使用する感じなので const table = ~; table = ~; が正しい形となります。→constなので変更できませんでした。すみません… あと、質問文に提示のコードですが、なぜ今のコードで二件目以降の内容が適用されるのか 私にはまだよくわかっていません。(試してみればわかるのかもしれませんが…) そして、私のテストしてみたコードは、質問文のコードに追記した内容ではなく テスト用に書いたコードです。そのため質問文のコードに入れるには不適切なのですが 参考になるかもしれないので書きますと function myFunction() { const table = DocumentApp.getActiveDocument().getBody().getTables()[0]; const table2 = DocumentApp.getActiveDocument().getBody().getTables()[1]; var doc= DocumentApp.create('rrr'); doc.getBody().appendTable(table.copy()); doc.getBody().appendTable(table2.copy()); doc.getBody().appendPageBreak(); doc.getBody().appendTable(table.copy()); doc.getBody().appendTable(table2.copy()); } という感じです。 見ての通り一つ目と二つ目のテーブルを追加していって、ちゃんとドキュメントが出来るかというテストをしてみただけです。
Tsubanishi

2021/04/03 13:34

サンプルコードありがとうございます。これをヒントに作成したらできました。 とても勉強になりました。又、やっと謎が解けてスッキリしました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問