質問編集履歴

2

修正しました

2020/05/25 12:46

投稿

popopopooon
popopopooon

スコア4

test CHANGED
File without changes
test CHANGED
@@ -3,247 +3,3 @@
3
3
  スプレッドシートの特定の列に画像のURLを並べて上から順に、Cloud vison APIの
4
4
 
5
5
  label detectionを用いてdetectionおよびscoreを取得したいと思っております。
6
-
7
-
8
-
9
- https://docs.google.com/spreadsheets/d/1oPDhh7kj4QKE7Hhj1ePSxPC50u4AsLgrNqAmx1J7AYs/edit?usp=sharing
10
-
11
-
12
-
13
- 下記URLを参考に、OAuth認証からAPI稼働まで行いましたが何点かエラーが出ました。
14
-
15
- ①Google Apps Script DE OAuth2 ~ GASで直接触れない Google APIを叩いてみるお~
16
-
17
- [https://qiita.com/soundTricker/items/b4df3072088fcbd0e36d](https://qiita.com/soundTricker/items/b4df3072088fcbd0e36d)
18
-
19
- ②GASとGoogle Cloud Vision APIで認識精度を検証してみた
20
-
21
- [https://qiita.com/ttyokoyama/items/4c4d08bbde6b8a8dd243](https://qiita.com/ttyokoyama/items/4c4d08bbde6b8a8dd243)
22
-
23
- ③Google Apps Script で Cloud Vision API を使ってみる
24
-
25
- [https://qiita.com/wezardnet/items/ebd0c98f3fc04bcc53a0](https://qiita.com/wezardnet/items/ebd0c98f3fc04bcc53a0)
26
-
27
-
28
-
29
- エラーメッセージとしましては…
30
-
31
- TypeError: null のメソッド「indexOf」を呼び出せません。
32
-
33
- TypeError: undefined からプロパティ「parameter」を読み取れません。
34
-
35
- (function callback(e)のcredentialsで定義している中身のparameterに対して発生しました)
36
-
37
-
38
-
39
-
40
-
41
- ### 該当のソースコード
42
-
43
- my_cloudVisionApi_clientIDと示した場所に自分のclientIDを入れて実行してみています。
44
-
45
- そもそもの使い方も間違っているのではないかと不安です。
46
-
47
-
48
-
49
- ```google app scripts
50
-
51
- //OAuth2.0認証
52
-
53
- function doGet(e){
54
-
55
- var scriptProperties = PropertiesService.getScriptProperties() ;
56
-
57
- var accessToken = scriptProperties.getProperty('access_token') ;
58
-
59
- var param = {
60
-
61
- "response_type": 'code',
62
-
63
- "client_id": scriptProperties.getProperty('my_cloudVisionApi_clientID'),
64
-
65
- "redirect_uri": getCallbackURL_(),
66
-
67
- "state": ScriptApp.newStateToken().withMethod('callback').withArgument('name', 'value').withTimeout(2000).createToken(),
68
-
69
- "scope": 'https://www.googleapis.com/auth/cloud-platform',
70
-
71
- "access_type": 'offline',
72
-
73
- "approval_prompt": 'force'
74
-
75
- };
76
-
77
- var params = [] ;
78
-
79
- for ( var name in param ) {
80
-
81
- params.push(name + '=' + encodeURIComponent(param[name])) ;
82
-
83
- }
84
-
85
- var url = 'https://accounts.google.com/o/oauth2/auth?' + params.join('&') ;
86
-
87
- return HtmlService.createHtmlOutput('<a href="' + url + '" target="_blank">認証</a>') ;
88
-
89
- }
90
-
91
-
92
-
93
- function getCallbackURL_(){
94
-
95
- var url = ScriptApp.getService().getUrl() ;
96
-
97
- if ( url.indexOf('/exec') >= 0 ) return url.slice(0, -4) + 'usercallback' ;
98
-
99
- return url.slice(0, -3) + 'usercallback' ;
100
-
101
- }
102
-
103
-
104
-
105
- function callback(e){
106
-
107
- var credentials = fetchAccessToken_(e.parameter.code) ;
108
-
109
- var scriptProperties = PropertiesService.getScriptProperties() ;
110
-
111
- scriptProperties.setProperty('access_token', credentials.access_token) ;
112
-
113
- scriptProperties.setProperty('refresh_token', credentials.refresh_token) ;
114
-
115
- }
116
-
117
-
118
-
119
- //labelDetection分析
120
-
121
- function placeDetection() {
122
-
123
- var targetFolder = PropertiesService.getScriptProperties().getProperty("target_folder");
124
-
125
- var folder = Drive.Children.list(targetFolder, {q: "trashed=false"});
126
-
127
- for(var i = 0; i < folder.items.length; i++) {
128
-
129
- var target = Drive.Files.get(folder.items[i].id);
130
-
131
- var file = DriveApp.getFileById(target.id);
132
-
133
-
134
-
135
- var result = imageAnnotate(file);
136
-
137
- if(!result) {
138
-
139
- Logger.log("target file name = " + target.title);
140
-
141
- }
142
-
143
- }
144
-
145
- }
146
-
147
-
148
-
149
- function imageAnnotate(file){
150
-
151
- var accessToken = PropertiesService.getScriptProperties().getProperty("access_token");
152
-
153
-
154
-
155
- var payload = JSON.stringify({
156
-
157
- "requests":[
158
-
159
- {
160
-
161
- "image": {
162
-
163
- "content": Utilities.base64Encode(file.getBlob().getBytes())
164
-
165
- },
166
-
167
- "features": [
168
-
169
- {
170
-
171
- "type": "TEXT_DETECTION",
172
-
173
- "maxResults": 100
174
-
175
- }
176
-
177
- ],
178
-
179
- }
180
-
181
- ]
182
-
183
- });
184
-
185
-
186
-
187
- try {
188
-
189
- var res = UrlFetchApp.fetch("https://vision.googleapis.com/v1/images:annotate",
190
-
191
- {
192
-
193
- method : 'post',
194
-
195
- headers: {
196
-
197
- authorization: 'Bearer ' + accessToken
198
-
199
- },
200
-
201
- contentType: 'application/json',
202
-
203
- payload : payload
204
-
205
- });
206
-
207
- } catch(e) {
208
-
209
- // 失敗
210
-
211
- Logger.log(e);
212
-
213
- return false;
214
-
215
- }
216
-
217
-
218
-
219
- var obj = JSON.parse(res.getContentText());
220
-
221
- var res = obj.responses;
222
-
223
-
224
-
225
- for(var i = 0; i < res.length; i++) {
226
-
227
- // Logger.log(res[i].textAnnotations);
228
-
229
- var textAnnotations = res[i].textAnnotations;
230
-
231
- for(var j = 0; j < textAnnotations.length; j++) {
232
-
233
- Logger.log(textAnnotations[j].description);
234
-
235
- }
236
-
237
- }
238
-
239
-
240
-
241
- return true;
242
-
243
- }
244
-
245
- ```
246
-
247
- ### 試したこと
248
-
249
- apiの結果をjson形式で取得し、jsonからスプレッドシートに反映するように考えておりました。

1

コードを追加しました。

2020/05/25 12:46

投稿

popopopooon
popopopooon

スコア4

test CHANGED
File without changes
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- エラーメッセージとしましては…
29
+ エラーメッセージとしましては…
30
30
 
31
31
  TypeError: null のメソッド「indexOf」を呼び出せません。
32
32
 
@@ -36,9 +36,213 @@
36
36
 
37
37
 
38
38
 
39
+
40
+
39
41
  ### 該当のソースコード
40
42
 
43
+ my_cloudVisionApi_clientIDと示した場所に自分のclientIDを入れて実行してみています。
44
+
41
- ほぼ参考URLからコピペで作成しましたので割愛たします。
45
+ そもそも使い方も間違っているのではなかと不安です。
46
+
47
+
48
+
49
+ ```google app scripts
50
+
51
+ //OAuth2.0認証
52
+
53
+ function doGet(e){
54
+
55
+ var scriptProperties = PropertiesService.getScriptProperties() ;
56
+
57
+ var accessToken = scriptProperties.getProperty('access_token') ;
58
+
59
+ var param = {
60
+
61
+ "response_type": 'code',
62
+
63
+ "client_id": scriptProperties.getProperty('my_cloudVisionApi_clientID'),
64
+
65
+ "redirect_uri": getCallbackURL_(),
66
+
67
+ "state": ScriptApp.newStateToken().withMethod('callback').withArgument('name', 'value').withTimeout(2000).createToken(),
68
+
69
+ "scope": 'https://www.googleapis.com/auth/cloud-platform',
70
+
71
+ "access_type": 'offline',
72
+
73
+ "approval_prompt": 'force'
74
+
75
+ };
76
+
77
+ var params = [] ;
78
+
79
+ for ( var name in param ) {
80
+
81
+ params.push(name + '=' + encodeURIComponent(param[name])) ;
82
+
83
+ }
84
+
85
+ var url = 'https://accounts.google.com/o/oauth2/auth?' + params.join('&') ;
86
+
87
+ return HtmlService.createHtmlOutput('<a href="' + url + '" target="_blank">認証</a>') ;
88
+
89
+ }
90
+
91
+
92
+
93
+ function getCallbackURL_(){
94
+
95
+ var url = ScriptApp.getService().getUrl() ;
96
+
97
+ if ( url.indexOf('/exec') >= 0 ) return url.slice(0, -4) + 'usercallback' ;
98
+
99
+ return url.slice(0, -3) + 'usercallback' ;
100
+
101
+ }
102
+
103
+
104
+
105
+ function callback(e){
106
+
107
+ var credentials = fetchAccessToken_(e.parameter.code) ;
108
+
109
+ var scriptProperties = PropertiesService.getScriptProperties() ;
110
+
111
+ scriptProperties.setProperty('access_token', credentials.access_token) ;
112
+
113
+ scriptProperties.setProperty('refresh_token', credentials.refresh_token) ;
114
+
115
+ }
116
+
117
+
118
+
119
+ //labelDetection分析
120
+
121
+ function placeDetection() {
122
+
123
+ var targetFolder = PropertiesService.getScriptProperties().getProperty("target_folder");
124
+
125
+ var folder = Drive.Children.list(targetFolder, {q: "trashed=false"});
126
+
127
+ for(var i = 0; i < folder.items.length; i++) {
128
+
129
+ var target = Drive.Files.get(folder.items[i].id);
130
+
131
+ var file = DriveApp.getFileById(target.id);
132
+
133
+
134
+
135
+ var result = imageAnnotate(file);
136
+
137
+ if(!result) {
138
+
139
+ Logger.log("target file name = " + target.title);
140
+
141
+ }
142
+
143
+ }
144
+
145
+ }
146
+
147
+
148
+
149
+ function imageAnnotate(file){
150
+
151
+ var accessToken = PropertiesService.getScriptProperties().getProperty("access_token");
152
+
153
+
154
+
155
+ var payload = JSON.stringify({
156
+
157
+ "requests":[
158
+
159
+ {
160
+
161
+ "image": {
162
+
163
+ "content": Utilities.base64Encode(file.getBlob().getBytes())
164
+
165
+ },
166
+
167
+ "features": [
168
+
169
+ {
170
+
171
+ "type": "TEXT_DETECTION",
172
+
173
+ "maxResults": 100
174
+
175
+ }
176
+
177
+ ],
178
+
179
+ }
180
+
181
+ ]
182
+
183
+ });
184
+
185
+
186
+
187
+ try {
188
+
189
+ var res = UrlFetchApp.fetch("https://vision.googleapis.com/v1/images:annotate",
190
+
191
+ {
192
+
193
+ method : 'post',
194
+
195
+ headers: {
196
+
197
+ authorization: 'Bearer ' + accessToken
198
+
199
+ },
200
+
201
+ contentType: 'application/json',
202
+
203
+ payload : payload
204
+
205
+ });
206
+
207
+ } catch(e) {
208
+
209
+ // 失敗
210
+
211
+ Logger.log(e);
212
+
213
+ return false;
214
+
215
+ }
216
+
217
+
218
+
219
+ var obj = JSON.parse(res.getContentText());
220
+
221
+ var res = obj.responses;
222
+
223
+
224
+
225
+ for(var i = 0; i < res.length; i++) {
226
+
227
+ // Logger.log(res[i].textAnnotations);
228
+
229
+ var textAnnotations = res[i].textAnnotations;
230
+
231
+ for(var j = 0; j < textAnnotations.length; j++) {
232
+
233
+ Logger.log(textAnnotations[j].description);
234
+
235
+ }
236
+
237
+ }
238
+
239
+
240
+
241
+ return true;
242
+
243
+ }
244
+
245
+ ```
42
246
 
43
247
  ### 試したこと
44
248