回答編集履歴

9

対象行を修正

2021/11/15 00:33

投稿

退会済みユーザー
test CHANGED
@@ -356,88 +356,88 @@
356
356
 
357
357
  + var queryStr = queryStr.slice(0, -1);
358
358
 
359
+
360
+
361
+ + var response = service.fetch('https://api.twitter.com/1.1/search/tweets.json?' + +queryStr);
362
+
363
+ + var result = JSON.parse(response)
364
+
365
+ + return result.statuses
366
+
367
+ +}
368
+
369
+
370
+
371
+ // ② Twitterで検索する
372
+
373
+ var tweetList = findTweets(searchWord, lastTweetId);
374
+
375
+
376
+
377
+ // ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする
378
+
379
+ for (var j = 0, jl = tweetList.length; j < jl; j++ ) {
380
+
381
+ var tweet = tweetList[j];
382
+
383
+
384
+
385
+ // 重複処理をしないように最新のツイートIDを保存する
386
+
387
+ var titleRow = 1; // 『検索ワード』とか書いている部分の行数
388
+
389
+ var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで
390
+
391
+ var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる
392
+
393
+ updateCell.setValue(lastTweetId);
394
+
395
+ }
396
+
397
+ }
398
+
399
+
400
+
401
+ // pickUpSearchWords()は、main()内にあっても問題なく動くが、他の関数から利用することを考えると外に出した方がよい。
402
+
403
+ +// 検索ワードをスプレッドシートから取得する
404
+
405
+ +function pickUpSearchWords () {
406
+
407
+ + var titleRow = 1; // 『検索ワード』とか書いている部分の行数
408
+
409
+ + var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
410
+
411
+ + var startCol = 1;
412
+
413
+ + var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
414
+
415
+
416
+
417
+ + // !!!!!! 変更 !!!!!!!
418
+
419
+ + var endCol = 4; // 『実行回数』の列までなので4列目まで
420
+
421
+
422
+
423
+ + // 一括で取得する
424
+
425
+ + var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
426
+
359
427
  +
360
428
 
429
+ + // cellsの中身は
430
+
361
- + var response = service.fetch('https://api.twitter.com/1.1/search/tweets.json?' + +queryStr);
431
+ + // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
362
-
432
+
363
- + var result = JSON.parse(response)
433
+ + // という形式になる
434
+
364
-
435
+ +
436
+
365
- + return result.statuses
437
+ + return cells;
366
438
 
367
439
  +}
368
440
 
369
- +
370
-
371
- + // ② Twitterで検索する
372
-
373
- + var tweetList = findTweets(searchWord, lastTweetId);
374
-
375
- +
376
-
377
- + // ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする
378
-
379
- + for (var j = 0, jl = tweetList.length; j < jl; j++ ) {
380
-
381
- + var tweet = tweetList[j];
382
-
383
- +
384
-
385
- + // 重複処理をしないように最新のツイートIDを保存する
386
-
387
- + var titleRow = 1; // 『検索ワード』とか書いている部分の行数
388
-
389
- + var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで
390
-
391
- + var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる
392
-
393
- + updateCell.setValue(lastTweetId);
394
-
395
- + }
396
-
397
- }
398
-
399
-
400
-
401
- // pickUpSearchWords()は、main()内にあっても問題なく動くが、他の関数から利用することを考えると外に出した方がよい。
402
-
403
- +// 検索ワードをスプレッドシートから取得する
404
-
405
- +function pickUpSearchWords () {
406
-
407
- + var titleRow = 1; // 『検索ワード』とか書いている部分の行数
408
-
409
- + var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
410
-
411
- + var startCol = 1;
412
-
413
- + var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
414
-
415
-
416
-
417
- + // !!!!!! 変更 !!!!!!!
418
-
419
- + var endCol = 4; // 『実行回数』の列までなので4列目まで
420
-
421
-
422
-
423
- + // 一括で取得する
424
-
425
- + var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
426
-
427
- +
428
-
429
- + // cellsの中身は
430
-
431
- + // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
432
-
433
- + // という形式になる
434
-
435
- +
436
-
437
- + return cells;
438
-
439
- +}
440
-
441
441
  }
442
442
 
443
443
  ```

8

2021/11/15 00:33

投稿

退会済みユーザー
test CHANGED
@@ -288,6 +288,8 @@
288
288
 
289
289
  ```diff
290
290
 
291
+ ※質問文の一番最初のバージョンに記載されているコード
292
+
291
293
  function main () {
292
294
 
293
295
  // ① 検索ワードをスプレッドシートから取得する

7

2021/11/14 02:44

投稿

退会済みユーザー
test CHANGED
@@ -278,7 +278,7 @@
278
278
 
279
279
 
280
280
 
281
- 元の質問文では、下記色付き行で強調している部分が、forループの中に関数が定義されている状態になっています。
281
+ 元の質問文では、下記色付き行で強調している部分のうち、findTweets()関数が、forループの中に定義されている状態になっています。
282
282
 
283
283
  (単純なコピペミスでしょうか?)
284
284
 
@@ -314,6 +314,8 @@
314
314
 
315
315
 
316
316
 
317
+ // findTweets()は、forループの中に定義されてしまっているため、外に出した方がよい。
318
+
317
319
  +// ツイートを検索する
318
320
 
319
321
  +// 【参考】 https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-+tweets
@@ -394,45 +396,45 @@
394
396
 
395
397
 
396
398
 
397
-
399
+ // pickUpSearchWords()は、main()内にあっても問題なく動くが、他の関数から利用することを考えると外に出した方がよい。
398
-
400
+
399
- // 検索ワードをスプレッドシートから取得する
401
+ +// 検索ワードをスプレッドシートから取得する
400
-
402
+
401
- function pickUpSearchWords () {
403
+ +function pickUpSearchWords () {
402
-
404
+
403
- var titleRow = 1; // 『検索ワード』とか書いている部分の行数
405
+ + var titleRow = 1; // 『検索ワード』とか書いている部分の行数
404
-
406
+
405
- var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
407
+ + var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
406
-
408
+
407
- var startCol = 1;
409
+ + var startCol = 1;
408
-
410
+
409
- var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
411
+ + var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
410
-
411
-
412
-
412
+
413
+
414
+
413
- // !!!!!! 変更 !!!!!!!
415
+ + // !!!!!! 変更 !!!!!!!
414
-
416
+
415
- var endCol = 4; // 『実行回数』の列までなので4列目まで
417
+ + var endCol = 4; // 『実行回数』の列までなので4列目まで
416
-
417
-
418
-
418
+
419
+
420
+
419
- // 一括で取得する
421
+ + // 一括で取得する
420
-
422
+
421
- var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
423
+ + var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
424
+
422
-
425
+ +
423
-
424
-
426
+
425
- // cellsの中身は
427
+ + // cellsの中身は
426
-
428
+
427
- // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
429
+ + // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
428
-
430
+
429
- // という形式になる
431
+ + // という形式になる
432
+
430
-
433
+ +
431
-
432
-
434
+
433
- return cells;
435
+ + return cells;
434
-
436
+
435
- }
437
+ +}
436
438
 
437
439
  }
438
440
 

6

2021/11/14 02:43

投稿

退会済みユーザー
test CHANGED
@@ -282,7 +282,7 @@
282
282
 
283
283
  (単純なコピペミスでしょうか?)
284
284
 
285
- 上記の回答コードではこの部分を修正し、関数をforループの外に出しています。
285
+ 上記の回答コードではこの部分を修正し、関数をforループの外(厳密は、さらにその外であるmain()の外)に出しています。
286
286
 
287
287
  また、pickUpSearchWords()関数もmain()の外に出しています。
288
288
 

5

コメントでの質問を受けて追記

2021/11/14 02:37

投稿

退会済みユーザー
test CHANGED
@@ -271,3 +271,169 @@
271
271
 
272
272
 
273
273
  ```
274
+
275
+
276
+
277
+ # 追記(コメントより)
278
+
279
+
280
+
281
+ 元の質問文では、下記色付き行で強調している部分が、forループの中に関数が定義されている状態になっています。
282
+
283
+ (単純なコピペミスでしょうか?)
284
+
285
+ 上記の回答コードではこの部分を修正し、関数をforループの外に出しています。
286
+
287
+ また、pickUpSearchWords()関数もmain()の外に出しています。
288
+
289
+ ```diff
290
+
291
+ function main () {
292
+
293
+ // ① 検索ワードをスプレッドシートから取得する
294
+
295
+ var searchWords = pickUpSearchWords();
296
+
297
+
298
+
299
+ // searchWordsの中身は
300
+
301
+ // [ [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] ,....,]
302
+
303
+ // という形式になっているので1つずつ見ていく
304
+
305
+ for (var i = 0, il = searchWords.length; i < il; i++ ) {
306
+
307
+ var searchWord = searchWords[i][0];
308
+
309
+ var type = searchWords[i][1];
310
+
311
+ var lastTweetId = searchWords[i][2];
312
+
313
+
314
+
315
+
316
+
317
+ +// ツイートを検索する
318
+
319
+ +// 【参考】 https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-+tweets
320
+
321
+ +function findTweets (searchWord, lastTweetId) {
322
+
323
+ + var service = twitter.getService();
324
+
325
+ + var query = {
326
+
327
+ + q: searchWord, // 検索ワード
328
+
329
+ + lang: 'ja', // 日本語検索
330
+
331
+ + locale: 'ja', // 日本限定で検索
332
+
333
+ + result_type: 'recent', // 直近のツイートを検索
334
+
335
+ + since_id: lastTweetId // これ以前のツイートは見ない
336
+
337
+ + }
338
+
339
+ + // 検索の内容を queryStr にまとめていく
340
+
341
+ + var queryStr = '';
342
+
343
+ + for (var key in query) {
344
+
345
+ + // URLに日本語や記号を付けると上手く検索できないことがあるので#も変換する encodeURIComponent をする
346
+
347
+ + queryStr += key + '=' + encodeURIComponent(query[key]) + '&'
348
+
349
+ + }
350
+
351
+ + // &が余計に付いているので削除しておく
352
+
353
+ + var queryStr = queryStr.slice(0, -1);
354
+
355
+ +
356
+
357
+ + var response = service.fetch('https://api.twitter.com/1.1/search/tweets.json?' + +queryStr);
358
+
359
+ + var result = JSON.parse(response)
360
+
361
+ + return result.statuses
362
+
363
+ +}
364
+
365
+ +
366
+
367
+ + // ② Twitterで検索する
368
+
369
+ + var tweetList = findTweets(searchWord, lastTweetId);
370
+
371
+ +
372
+
373
+ + // ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする
374
+
375
+ + for (var j = 0, jl = tweetList.length; j < jl; j++ ) {
376
+
377
+ + var tweet = tweetList[j];
378
+
379
+ +
380
+
381
+ + // 重複処理をしないように最新のツイートIDを保存する
382
+
383
+ + var titleRow = 1; // 『検索ワード』とか書いている部分の行数
384
+
385
+ + var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで
386
+
387
+ + var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる
388
+
389
+ + updateCell.setValue(lastTweetId);
390
+
391
+ + }
392
+
393
+ }
394
+
395
+
396
+
397
+
398
+
399
+ // 検索ワードをスプレッドシートから取得する
400
+
401
+ function pickUpSearchWords () {
402
+
403
+ var titleRow = 1; // 『検索ワード』とか書いている部分の行数
404
+
405
+ var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
406
+
407
+ var startCol = 1;
408
+
409
+ var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
410
+
411
+
412
+
413
+ // !!!!!! 変更 !!!!!!!
414
+
415
+ var endCol = 4; // 『実行回数』の列までなので4列目まで
416
+
417
+
418
+
419
+ // 一括で取得する
420
+
421
+ var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
422
+
423
+
424
+
425
+ // cellsの中身は
426
+
427
+ // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
428
+
429
+ // という形式になる
430
+
431
+
432
+
433
+ return cells;
434
+
435
+ }
436
+
437
+ }
438
+
439
+ ```

4

修正

2021/11/14 02:35

投稿

退会済みユーザー
test CHANGED
@@ -1,38 +1,52 @@
1
+ ・**認証が完了しているのであれば、
2
+
1
- ・認証が正常にできているのであれば、authorize()やauthCallback()には何の問題もありません。
3
+  authorize()やauthCallback()には何の問題もありません。**
4
+
2
-
5
+ ```text
6
+
3
- 「認証が正常にできている」とは
7
+ ここでの「認証が完了している」とは
4
-
8
+
5
-  authorize()関数を手動実行
9
+  スクリプトエディタ上で authorize() 関数を手動実行
6
-
10
+
7
- =>表示されリンクをブラウザに貼り付けて移動。
11
+ => 表示されリンクをブラウザのURL入力欄に貼り付けて移動。
8
-
12
+
9
- =>Twitterの連携画面が表示されるので連携承認ボタンを押す
13
+ => Twitterの連携画面が表示されるので連携承認ボタンを押す
10
-
14
+
11
- =>左上に「SUCCESS!!」と表示される。
15
+ => ページが切り変わって左上に「SUCCESS!!」と表示される。
16
+
17
+
12
18
 
13
19
  までが完了している、という意味です)
14
20
 
15
-
21
+ ```
16
-
17
-   
18
-
19
-
20
-
22
+
23
+    
24
+
25
+  
26
+
21
- ・authCallback()関数は、認証手続中に内部的に呼ばれるものであり、直接実行するものではありません。
27
+ **authCallback()関数は**、認証手続中に内部的に呼ばれるものであり、**直接実行するものではありません**
22
-
28
+
23
- (authCallback()を直接実行するとエラーが出るのは仕様です)
29
+ (authCallback()を直接実行するとエラーが出るのは**仕様**です)
30
+
31
+  
32
+
24
-
33
+ また、**reset()**を実行すると、authorize()で設定したデータが**消えてしまいます**。
34
+
35
+  
36
+
25
-
37
+ したがって、上記の手順でauthorize()を実行~「SUCCESS!!」表示までが正常に表示された後は、
38
+
26
-
39
+ reset()やauthCallback()を実行する必要はありません。
27
-
40
+
41
+  
28
42
 
29
43
  ・認証が完了している状態で「『authCallback』の実行を飛ばして、『main』について、実行すると下記のように実行完了しますが、動作はしません。」とのことですが、
30
44
 
31
- 動作していないように見えるだけで、質問文記載のコード自体は動いていると思われます。
45
+ **動作していないように見えるだけ**で、質問文記載のコード自体は動いていると思われます。
32
-
33
-
34
-
35
-
46
+
47
+  
48
+
49
+  
36
50
 
37
51
  質問文記載のコードのmain()関数以下で行おうとしていることは単に、
38
52
 

3

2021/11/14 01:56

投稿

退会済みユーザー
test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  ---
48
48
 
49
- ・下記に例として、シート1に指定した検索ワードの検索結果を表示するコードを記載します。
49
+ ・下記に例として、シート1に指定した検索ワードの検索結果をログ表示するコードを記載します。
50
50
 
51
51
  authorize()、authCallback()は変更していません。
52
52
 

2

2021/11/14 00:02

投稿

退会済みユーザー
test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  ・下記に例として、シート1に指定した検索ワードの検索結果を表示するコードを記載します。
50
50
 
51
- authorize()、anthCallback()は変更していません。
51
+ authorize()、authCallback()は変更していません。
52
52
 
53
53
  main()以下を変更しています。
54
54
 

1

2021/11/14 00:00

投稿

退会済みユーザー
test CHANGED
@@ -104,6 +104,12 @@
104
104
 
105
105
 
106
106
 
107
+ // セルを取得
108
+
109
+ var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名
110
+
111
+
112
+
107
113
  function main() {
108
114
 
109
115
  // ① 検索ワードをスプレッドシートから取得する