回答編集履歴

8

 

2022/05/31 22:03

投稿

退会済みユーザー
test CHANGED
@@ -175,6 +175,6 @@
175
175
  }
176
176
  ```
177
177
 
178
- あとは、上記を保存して、スプレッドシートを開きなおし、メニューの「PDF作成」を実行します。
178
+ あとは、上記を保存して、スプレッドシートを開きなおし、メニューの「GAS実行」→「PDF作成」を実行します。
179
179
 
180
180
 

7

 

2022/05/31 22:03

投稿

退会済みユーザー
test CHANGED
@@ -74,7 +74,6 @@
74
74
  // PDFテンプレートシートの名前
75
75
  const pdfSheetName = 'PDF';
76
76
  const shPdf = ss.getSheetByName(pdfSheetName);
77
- const shId = shPdf.getSheetId();
78
77
 
79
78
  if (shList == null) {
80
79
  console.log(`シート「${listSheetName}」が見つかりません。`);
@@ -88,6 +87,7 @@
88
87
  return;
89
88
  }
90
89
 
90
+ const shId = shPdf.getSheetId();
91
91
  const names = shList.getRange(1, 1, shList.getLastRow(), 1).getValues().flat();
92
92
 
93
93
  // リストから1つずつ名前を読み取って実行する

6

修正

2022/05/31 22:01

投稿

退会済みユーザー
test CHANGED
@@ -68,14 +68,13 @@
68
68
 
69
69
  let ssId = ss.getId();
70
70
 
71
- let shId = ss.getActiveSheet().getSheetId();
72
-
73
71
  // 名前リストシートの名前
74
72
  const listSheetName = 'リスト';
75
73
  const shList = ss.getSheetByName(listSheetName);
76
74
  // PDFテンプレートシートの名前
77
75
  const pdfSheetName = 'PDF';
78
76
  const shPdf = ss.getSheetByName(pdfSheetName);
77
+ const shId = shPdf.getSheetId();
79
78
 
80
79
  if (shList == null) {
81
80
  console.log(`シート「${listSheetName}」が見つかりません。`);

5

 

2022/05/31 16:05

投稿

退会済みユーザー
test CHANGED
@@ -1,3 +1,5 @@
1
+ # ソースコードを追記していただく前の回答
2
+
1
3
  「システム」というか、流れ/考え方としては下記のようになるでしょうか。
2
4
 
3
5
  (質問では具体的なコードが全く提示されていないので、こちらの回答としても具体的なコードでは示せませんが)
@@ -34,5 +36,146 @@
34
36
  ・指定したシートから指定したセルのデータを読み取るコード
35
37
  ・請求書pdfを作成する具体的なコード
36
38
  をそれぞれ実装して、つなげればよいだけです。
37
- (というか、「修正前」のコードが存在していて、正しく動いており、かつその内容を理解できているなら、提示した修正後の実装コードは、ボタン設定とfor文の使い方さえ分かっていればすぐ実装できそうですよね)
38
39
 
40
+ -----------
41
+ # ソースコードを追記していただいた後の回答
42
+
43
+ 下記の部分が「プルダウンのセルから出力対象となる名前を取得する部分」になっています。
44
+ ```
45
+ //D4セルを取得する
46
+ let fileNum = ss.getActiveSheet().getRange("D4").getValue();
47
+ ```
48
+
49
+ したがって、この部分を、「入力シートから1つずつ名前を取得してcreatePdf関数に渡す処理」に変えればよいということになります。
50
+
51
+
52
+ ・準備
53
+ ①D4セルにプルダウンのあるシートの名前を「PDF」に変えてください。
54
+ ②スプレッドシート内に名前一覧を入力するシートを新規作成し、名前を「リスト」に変えてください。
55
+ ③ ②の「リスト」シートのA列1行目から、PDF出力したい名前を入力してください。
56
+ ④ プルダウンに入力規則が設定されているままだと実行時にエラーになる可能性があるので、PDFシートのD4セルのプルダウンは解除(削除)しておいてください。
57
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-06-01/210ef6a7-d92d-468d-b22e-4f6552e09bce.png)
58
+
59
+ コードを下記のように直します。
60
+
61
+ コード1
62
+ ```js
63
+ function savePdf() {
64
+ //PDFの保存先
65
+ let folderId = "**************";
66
+
67
+ let ss = SpreadsheetApp.getActiveSpreadsheet();
68
+
69
+ let ssId = ss.getId();
70
+
71
+ let shId = ss.getActiveSheet().getSheetId();
72
+
73
+ // 名前リストシートの名前
74
+ const listSheetName = 'リスト';
75
+ const shList = ss.getSheetByName(listSheetName);
76
+ // PDFテンプレートシートの名前
77
+ const pdfSheetName = 'PDF';
78
+ const shPdf = ss.getSheetByName(pdfSheetName);
79
+
80
+ if (shList == null) {
81
+ console.log(`シート「${listSheetName}」が見つかりません。`);
82
+ Browser.msgBox(`シート「${listSheetName}」が見つかりません。`);
83
+ return;
84
+ }
85
+
86
+ if (shPdf == null) {
87
+ console.log(`シート「${pdfSheetName}」が見つかりません。`);
88
+ Browser.msgBox(`シート「${pdfSheetName}」が見つかりません。`);
89
+ return;
90
+ }
91
+
92
+ const names = shList.getRange(1, 1, shList.getLastRow(), 1).getValues().flat();
93
+
94
+ // リストから1つずつ名前を読み取って実行する
95
+ for (const name of names) {
96
+ // D4セルに名前を入力
97
+ shPdf.getRange('D4').setValue(name);
98
+ SpreadsheetApp.flush();
99
+ //関数createPdfを実行し、PDFを作成して保存する
100
+ createPdf(folderId, ssId, shId, name);
101
+ console.log(`ファイル名「${name}.pdf」を生成しました。`);
102
+ }
103
+ }
104
+
105
+ //PDFを作成し指定したフォルダーに保存する関数
106
+ //以下4つの引数を指定する必要がある
107
+ //1: フォルダーID (folderId)
108
+ //2: スプレッドシートID (ssId)
109
+ //3: シートID (shId)
110
+ //4: ファイル名 (fileName)
111
+ function createPdf(folderId, ssId, shId, fileName) {
112
+ //PDFを作成するためのベースとなるURL
113
+ let baseUrl = "https://docs.google.com/spreadsheets/d/"
114
+ + ssId
115
+ + "/export?gid="
116
+ + shId;
117
+
118
+ //★★★自由にカスタマイズしてください★★★
119
+ //PDFのオプションを指定
120
+ let pdfOptions = "&exportFormat=pdf&format=pdf"
121
+ + "&size=A4" //用紙サイズ (A4)
122
+ + "&portrait=false" //用紙の向き true: 縦向き / false: 横向き
123
+ + "&fitw=true" //ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大
124
+ + "&top_margin=0.50" //上の余白
125
+ + "&right_margin=0.50" //右の余白
126
+ + "&bottom_margin=0.50" //下の余白
127
+ + "&left_margin=0.50" //左の余白
128
+ + "&horizontal_alignment=CENTER" //水平方向の位置
129
+ + "&vertical_alignment=TOP" //垂直方向の位置
130
+ + "&printtitle=false" //スプレッドシート名の表示有無
131
+ + "&sheetnames=false" //シート名の表示有無
132
+ + "&gridlines=false" //グリッドラインの表示有無
133
+ + "&fzr=false" //固定行の表示有無
134
+ + "&fzc=false" //固定列の表示有無;
135
+
136
+ //PDFを作成するためのURL
137
+ let url = baseUrl + pdfOptions;
138
+
139
+ //アクセストークンを取得する
140
+ let token = ScriptApp.getOAuthToken();
141
+
142
+ //headersにアクセストークンを格納する
143
+ let options = {
144
+ headers: {
145
+ 'Authorization': 'Bearer ' + token
146
+ }
147
+ };
148
+
149
+ //PDFを作成する
150
+ let blob = UrlFetchApp.fetch(url, options).getBlob().setName(fileName + '.pdf');
151
+
152
+ //PDFの保存先フォルダー
153
+ //フォルダーIDは引数のfolderIdを使用します
154
+ let folder = DriveApp.getFolderById(folderId);
155
+
156
+ //PDFを指定したフォルダに保存する
157
+ folder.createFile(blob);
158
+ }
159
+ ```
160
+
161
+ コード2
162
+ ```js
163
+ function onOpen() {
164
+ let ui = SpreadsheetApp.getUi()
165
+
166
+ //メニュー名を決定
167
+ //★★★メニュー名は好きなものに置き換えてください★★★
168
+ let menu = ui.createMenu("GAS実行");
169
+
170
+ //メニューに実行ボタン名と関数を割り当て
171
+ //★★★実行ボタン名は好きなものに置き換えてください★★★
172
+ menu.addItem("PDF作成","savePdf");
173
+
174
+ //スプレッドシートに反映
175
+ menu.addToUi();
176
+ }
177
+ ```
178
+
179
+ あとは、上記を保存して、スプレッドシートを開きなおし、メニューの「PDF作成」を実行します。
180
+
181
+

4

 

2022/05/31 13:46

投稿

退会済みユーザー
test CHANGED
@@ -34,5 +34,5 @@
34
34
  ・指定したシートから指定したセルのデータを読み取るコード
35
35
  ・請求書pdfを作成する具体的なコード
36
36
  をそれぞれ実装して、つなげればよいだけです。
37
+ (というか、「修正前」のコードが存在していて、正しく動いており、かつその内容を理解できているなら、提示した修正後の実装コードは、ボタン設定とfor文の使い方さえ分かっていればすぐ実装できそうですよね)
37
38
 
38
-

3

 

2022/05/31 13:41

投稿

退会済みユーザー
test CHANGED
@@ -26,3 +26,13 @@
26
26
  ⑤ 請求書作成関数の中で指定された引数の名前を持つ請求書pdfを作成する。
27
27
  ⑥ ④~⑤の処理について、最後の名前に到達するまで繰り返す。
28
28
 
29
+ ---
30
+ 上記により、「課題を解決する処理」を、単純な作業に分解しました。
31
+ あとは
32
+ ・ボタンを押すと指定したスクリプトを実行するような設定
33
+ ・for文の基本的な使用法
34
+ ・指定したシートから指定したセルのデータを読み取るコード
35
+ ・請求書pdfを作成する具体的なコード
36
+ をそれぞれ実装して、つなげればよいだけです。
37
+
38
+

2

 

2022/05/31 13:39

投稿

退会済みユーザー
test CHANGED
@@ -22,7 +22,7 @@
22
22
  ①請求書pdfを作成したい複数の名前を入力するシートを用意する。
23
23
  ② ①のシートに、請求書pdfを作成したい対象の名前を、あらかじめ全部入力しておく。
24
24
  ③ ボタンを押すと④以降を実行するように設定しておく
25
- ④ (処理本体)for文で ①の名前を1つずつ取得し、請求書pdf作成関数のパラメータに設定して渡す。
25
+ ④ (処理本体)for文で ①から作成対象の名前を1つずつ取得し、請求書pdf作成関数のパラメータに設定して渡す。
26
26
  ⑤ 請求書作成関数の中で指定された引数の名前を持つ請求書pdfを作成する。
27
27
  ⑥ ④~⑤の処理について、最後の名前に到達するまで繰り返す。
28
28
 

1

  

2022/05/31 13:38

投稿

退会済みユーザー
test CHANGED
@@ -1,5 +1,8 @@
1
+ 「システム」というか、流れ/考え方としては下記のようになるでしょうか。
2
+
3
+ (質問では具体的なコードが全く提示されていないので、こちらの回答としても具体的なコードでは示せませんが)
1
4
  <やりたいこと>
2
- 複数の対象を"指定"し、それぞれの請求書を作成する。
5
+ 複数の対象を"指定"し、それぞれの請求書pdfを作成する。
3
6
 
4
7
  <現状の課題>
5
8
  対象の指定を「ひとりひとりを、プルダウンから選択する」という作業で行っているが、これが煩雑であること。
@@ -12,14 +15,14 @@
12
15
  ①プルダウンのセルの変更をトリガーで検知
13
16
  ②変更されたプルダウンのセルの名前を読み取る
14
17
  ③②で得られた名前を請求書作成関数のパラメータに設定して呼び出す。
15
- ④請求書作成関数の中で指定された引数の名前を持つ請求書を作成する。
18
+ ④請求書作成関数の中で指定された引数の名前を持つ請求書pdfを作成する。
16
19
 
17
20
  <修正実装方針>
18
21
  これを下記のように修正する。
19
- ①請求書を作成したい複数の名前を入力するシートを用意する。
22
+ ①請求書pdfを作成したい複数の名前を入力するシートを用意する。
20
- ② ①のシートに、請求書を作成したい対象の名前を、あらかじめ全部入力しておく。
23
+ ② ①のシートに、請求書pdfを作成したい対象の名前を、あらかじめ全部入力しておく。
21
24
  ③ ボタンを押すと④以降を実行するように設定しておく
22
- ④ (処理本体)for文で ①の名前を1つずつ取得し、請求書作成関数のパラメータに設定して渡す。
25
+ ④ (処理本体)for文で ①の名前を1つずつ取得し、請求書pdf作成関数のパラメータに設定して渡す。
23
- ⑤ 請求書作成関数の中で指定された引数の名前を持つ請求書を作成する。
26
+ ⑤ 請求書作成関数の中で指定された引数の名前を持つ請求書pdfを作成する。
24
27
  ⑥ ④~⑤の処理について、最後の名前に到達するまで繰り返す。
25
28