回答編集履歴
9
対象行を修正
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
|
-
+
|
431
|
+
+ // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
|
362
|
-
|
432
|
+
|
363
|
-
+
|
433
|
+
+ // という形式になる
|
434
|
+
|
364
|
-
|
435
|
+
+
|
436
|
+
|
365
|
-
+ return
|
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
test
CHANGED
@@ -288,6 +288,8 @@
|
|
288
288
|
|
289
289
|
```diff
|
290
290
|
|
291
|
+
※質問文の一番最初のバージョンに記載されているコード
|
292
|
+
|
291
293
|
function main () {
|
292
294
|
|
293
295
|
// ① 検索ワードをスプレッドシートから取得する
|
7
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
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
コメントでの質問を受けて追記
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
修正
test
CHANGED
@@ -1,38 +1,52 @@
|
|
1
|
+
・**認証が完了しているのであれば、
|
2
|
+
|
1
|
-
|
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
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
test
CHANGED
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
・下記に例として、シート1に指定した検索ワードの検索結果を表示するコードを記載します。
|
50
50
|
|
51
|
-
authorize()、a
|
51
|
+
authorize()、authCallback()は変更していません。
|
52
52
|
|
53
53
|
main()以下を変更しています。
|
54
54
|
|
1
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
|
// ① 検索ワードをスプレッドシートから取得する
|