回答編集履歴
8
test
CHANGED
@@ -175,6 +175,6 @@
|
|
175
175
|
}
|
176
176
|
```
|
177
177
|
|
178
|
-
あとは、上記を保存して、スプレッドシートを開きなおし、メニューの「PDF作成」を実行します。
|
178
|
+
あとは、上記を保存して、スプレッドシートを開きなおし、メニューの「GAS実行」→「PDF作成」を実行します。
|
179
179
|
|
180
180
|
|
7
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
修正
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
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
|
+

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