回答編集履歴
9
対象行を修正
answer
CHANGED
@@ -177,25 +177,25 @@
|
|
177
177
|
+ }
|
178
178
|
+ // &が余計に付いているので削除しておく
|
179
179
|
+ var queryStr = queryStr.slice(0, -1);
|
180
|
-
|
180
|
+
|
181
181
|
+ var response = service.fetch('https://api.twitter.com/1.1/search/tweets.json?' + +queryStr);
|
182
182
|
+ var result = JSON.parse(response)
|
183
183
|
+ return result.statuses
|
184
184
|
+}
|
185
|
-
|
185
|
+
|
186
|
-
|
186
|
+
// ② Twitterで検索する
|
187
|
-
|
187
|
+
var tweetList = findTweets(searchWord, lastTweetId);
|
188
|
-
|
188
|
+
|
189
|
-
|
189
|
+
// ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする
|
190
|
-
|
190
|
+
for (var j = 0, jl = tweetList.length; j < jl; j++ ) {
|
191
|
-
|
191
|
+
var tweet = tweetList[j];
|
192
|
-
|
192
|
+
|
193
|
-
|
193
|
+
// 重複処理をしないように最新のツイートIDを保存する
|
194
|
-
|
194
|
+
var titleRow = 1; // 『検索ワード』とか書いている部分の行数
|
195
|
-
|
195
|
+
var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで
|
196
|
-
|
196
|
+
var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる
|
197
|
-
|
197
|
+
updateCell.setValue(lastTweetId);
|
198
|
-
|
198
|
+
}
|
199
199
|
}
|
200
200
|
|
201
201
|
// pickUpSearchWords()は、main()内にあっても問題なく動くが、他の関数から利用することを考えると外に出した方がよい。
|
8
answer
CHANGED
@@ -143,6 +143,7 @@
|
|
143
143
|
上記の回答コードではこの部分を修正し、関数をforループの外(厳密には、さらにその外であるmain()の外)に出しています。
|
144
144
|
また、pickUpSearchWords()関数もmain()の外に出しています。
|
145
145
|
```diff
|
146
|
+
※質問文の一番最初のバージョンに記載されているコード
|
146
147
|
function main () {
|
147
148
|
// ① 検索ワードをスプレッドシートから取得する
|
148
149
|
var searchWords = pickUpSearchWords();
|
7
answer
CHANGED
@@ -138,7 +138,7 @@
|
|
138
138
|
|
139
139
|
# 追記(コメントより)
|
140
140
|
|
141
|
-
元の質問文では、下記色付き行で強調している部分が、forループの中に
|
141
|
+
元の質問文では、下記色付き行で強調している部分のうち、findTweets()関数が、forループの中に定義されている状態になっています。
|
142
142
|
(単純なコピペミスでしょうか?)
|
143
143
|
上記の回答コードではこの部分を修正し、関数をforループの外(厳密には、さらにその外であるmain()の外)に出しています。
|
144
144
|
また、pickUpSearchWords()関数もmain()の外に出しています。
|
@@ -156,6 +156,7 @@
|
|
156
156
|
var lastTweetId = searchWords[i][2];
|
157
157
|
|
158
158
|
|
159
|
+
// findTweets()は、forループの中に定義されてしまっているため、外に出した方がよい。
|
159
160
|
+// ツイートを検索する
|
160
161
|
+// 【参考】 https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-+tweets
|
161
162
|
+function findTweets (searchWord, lastTweetId) {
|
@@ -196,25 +197,25 @@
|
|
196
197
|
+ }
|
197
198
|
}
|
198
199
|
|
200
|
+
// pickUpSearchWords()は、main()内にあっても問題なく動くが、他の関数から利用することを考えると外に出した方がよい。
|
201
|
+
+// 検索ワードをスプレッドシートから取得する
|
202
|
+
+function pickUpSearchWords () {
|
203
|
+
+ var titleRow = 1; // 『検索ワード』とか書いている部分の行数
|
204
|
+
+ var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
|
205
|
+
+ var startCol = 1;
|
206
|
+
+ var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
|
199
207
|
|
200
|
-
//
|
208
|
+
+ // !!!!!! 変更 !!!!!!!
|
201
|
-
function pickUpSearchWords () {
|
202
|
-
var
|
209
|
+
+ var endCol = 4; // 『実行回数』の列までなので4列目まで
|
203
|
-
var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
|
204
|
-
var startCol = 1;
|
205
|
-
var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
|
206
210
|
|
207
|
-
// !!!!!! 変更 !!!!!!!
|
208
|
-
var endCol = 4; // 『実行回数』の列までなので4列目まで
|
209
|
-
|
210
|
-
// 一括で取得する
|
211
|
+
+ // 一括で取得する
|
211
|
-
var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
|
212
|
+
+ var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
|
212
|
-
|
213
|
+
+
|
213
|
-
// cellsの中身は
|
214
|
+
+ // cellsの中身は
|
214
|
-
// [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
|
215
|
+
+ // [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
|
215
|
-
// という形式になる
|
216
|
+
+ // という形式になる
|
216
|
-
|
217
|
+
+
|
217
|
-
return cells;
|
218
|
+
+ return cells;
|
219
|
+
+}
|
218
220
|
}
|
219
|
-
}
|
220
221
|
```
|
6
answer
CHANGED
@@ -140,7 +140,7 @@
|
|
140
140
|
|
141
141
|
元の質問文では、下記色付き行で強調している部分が、forループの中に関数が定義されている状態になっています。
|
142
142
|
(単純なコピペミスでしょうか?)
|
143
|
-
上記の回答コードではこの部分を修正し、関数をforループの外に出しています。
|
143
|
+
上記の回答コードではこの部分を修正し、関数をforループの外(厳密には、さらにその外であるmain()の外)に出しています。
|
144
144
|
また、pickUpSearchWords()関数もmain()の外に出しています。
|
145
145
|
```diff
|
146
146
|
function main () {
|
5
コメントでの質問を受けて追記
answer
CHANGED
@@ -134,4 +134,87 @@
|
|
134
134
|
return result.statuses
|
135
135
|
}
|
136
136
|
|
137
|
+
```
|
138
|
+
|
139
|
+
# 追記(コメントより)
|
140
|
+
|
141
|
+
元の質問文では、下記色付き行で強調している部分が、forループの中に関数が定義されている状態になっています。
|
142
|
+
(単純なコピペミスでしょうか?)
|
143
|
+
上記の回答コードではこの部分を修正し、関数をforループの外に出しています。
|
144
|
+
また、pickUpSearchWords()関数もmain()の外に出しています。
|
145
|
+
```diff
|
146
|
+
function main () {
|
147
|
+
// ① 検索ワードをスプレッドシートから取得する
|
148
|
+
var searchWords = pickUpSearchWords();
|
149
|
+
|
150
|
+
// searchWordsの中身は
|
151
|
+
// [ [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] , [ '投稿内容', 'いいね or RT', '最終TweetId'] ,....,]
|
152
|
+
// という形式になっているので1つずつ見ていく
|
153
|
+
for (var i = 0, il = searchWords.length; i < il; i++ ) {
|
154
|
+
var searchWord = searchWords[i][0];
|
155
|
+
var type = searchWords[i][1];
|
156
|
+
var lastTweetId = searchWords[i][2];
|
157
|
+
|
158
|
+
|
159
|
+
+// ツイートを検索する
|
160
|
+
+// 【参考】 https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-+tweets
|
161
|
+
+function findTweets (searchWord, lastTweetId) {
|
162
|
+
+ var service = twitter.getService();
|
163
|
+
+ var query = {
|
164
|
+
+ q: searchWord, // 検索ワード
|
165
|
+
+ lang: 'ja', // 日本語検索
|
166
|
+
+ locale: 'ja', // 日本限定で検索
|
167
|
+
+ result_type: 'recent', // 直近のツイートを検索
|
168
|
+
+ since_id: lastTweetId // これ以前のツイートは見ない
|
169
|
+
+ }
|
170
|
+
+ // 検索の内容を queryStr にまとめていく
|
171
|
+
+ var queryStr = '';
|
172
|
+
+ for (var key in query) {
|
173
|
+
+ // URLに日本語や記号を付けると上手く検索できないことがあるので#も変換する encodeURIComponent をする
|
174
|
+
+ queryStr += key + '=' + encodeURIComponent(query[key]) + '&'
|
175
|
+
+ }
|
176
|
+
+ // &が余計に付いているので削除しておく
|
177
|
+
+ var queryStr = queryStr.slice(0, -1);
|
178
|
+
+
|
179
|
+
+ var response = service.fetch('https://api.twitter.com/1.1/search/tweets.json?' + +queryStr);
|
180
|
+
+ var result = JSON.parse(response)
|
181
|
+
+ return result.statuses
|
182
|
+
+}
|
183
|
+
+
|
184
|
+
+ // ② Twitterで検索する
|
185
|
+
+ var tweetList = findTweets(searchWord, lastTweetId);
|
186
|
+
+
|
187
|
+
+ // ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする
|
188
|
+
+ for (var j = 0, jl = tweetList.length; j < jl; j++ ) {
|
189
|
+
+ var tweet = tweetList[j];
|
190
|
+
+
|
191
|
+
+ // 重複処理をしないように最新のツイートIDを保存する
|
192
|
+
+ var titleRow = 1; // 『検索ワード』とか書いている部分の行数
|
193
|
+
+ var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで
|
194
|
+
+ var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる
|
195
|
+
+ updateCell.setValue(lastTweetId);
|
196
|
+
+ }
|
197
|
+
}
|
198
|
+
|
199
|
+
|
200
|
+
// 検索ワードをスプレッドシートから取得する
|
201
|
+
function pickUpSearchWords () {
|
202
|
+
var titleRow = 1; // 『検索ワード』とか書いている部分の行数
|
203
|
+
var startRow = 1 + titleRow; // 1行目は『検索ワード』とか書いているので2行目から
|
204
|
+
var startCol = 1;
|
205
|
+
var endRow = sheetData.getLastRow() - titleRow; // 最後の行まで(2行目から始まっているので-1している)
|
206
|
+
|
207
|
+
// !!!!!! 変更 !!!!!!!
|
208
|
+
var endCol = 4; // 『実行回数』の列までなので4列目まで
|
209
|
+
|
210
|
+
// 一括で取得する
|
211
|
+
var cells = sheetData.getRange(startRow, startCol, endRow, endCol).getValues();
|
212
|
+
|
213
|
+
// cellsの中身は
|
214
|
+
// [ [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] , [ '投稿内容', 'いいね or RT', '最終TweetId', '実行回数'] ,....,]
|
215
|
+
// という形式になる
|
216
|
+
|
217
|
+
return cells;
|
218
|
+
}
|
219
|
+
}
|
137
220
|
```
|
4
修正
answer
CHANGED
@@ -1,21 +1,28 @@
|
|
1
|
+
・**認証が完了しているのであれば、
|
1
|
-
|
2
|
+
authorize()やauthCallback()には何の問題もありません。**
|
3
|
+
```text
|
2
|
-
|
4
|
+
ここでの「認証が完了している」とは
|
3
|
-
|
5
|
+
スクリプトエディタ上で authorize() 関数を手動実行
|
4
|
-
=>表示され
|
6
|
+
=> 表示されたリンクをブラウザのURL入力欄に貼り付けて移動。
|
5
|
-
=>Twitterの連携画面が表示されるので連携承認ボタンを押す
|
7
|
+
=> Twitterの連携画面が表示されるので連携承認ボタンを押す。
|
6
|
-
=>左上に「SUCCESS!!」と表示される。
|
8
|
+
=> ページが切り変わって左上に「SUCCESS!!」と表示される。
|
9
|
+
|
7
10
|
までが完了している、という意味です)
|
8
|
-
|
11
|
+
```
|
9
|
-
|
10
|
-
|
12
|
+
|
13
|
+
|
11
|
-
・authCallback()関数は、認証手続中に内部的に呼ばれるものであり、直接実行するものではありません。
|
14
|
+
・**authCallback()関数は**、認証手続中に内部的に呼ばれるものであり、**直接実行するものではありません**。
|
12
|
-
(authCallback()を直接実行するとエラーが出るのは仕様です)
|
15
|
+
(authCallback()を直接実行するとエラーが出るのは**仕様**です)
|
16
|
+
|
13
|
-
|
17
|
+
また、**reset()**を実行すると、authorize()で設定したデータが**消えてしまいます**。
|
18
|
+
|
14
|
-
|
19
|
+
したがって、上記の手順でauthorize()を実行~「SUCCESS!!」表示までが正常に表示された後は、
|
20
|
+
reset()やauthCallback()を実行する必要はありません。
|
21
|
+
|
15
22
|
・認証が完了している状態で「『authCallback』の実行を飛ばして、『main』について、実行すると下記のように実行完了しますが、動作はしません。」とのことですが、
|
16
|
-
動作していないように見えるだけで、質問文記載のコード自体は動いていると思われます。
|
23
|
+
**動作していないように見えるだけ**で、質問文記載のコード自体は動いていると思われます。
|
17
|
-
|
18
|
-
|
24
|
+
|
25
|
+
|
19
26
|
質問文記載のコードのmain()関数以下で行おうとしていることは単に、
|
20
27
|
「シート1の特定セルから値(ツイートID)を取得して、同じ値を同じ場所に書き込む」(検索結果がなければ何もしない)という処理なので
|
21
28
|
実行しても何も動いていないように見えるだけであると考えられます。
|
3
answer
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
(for文の中に関数が定義されている点が不可解ですが・・・)
|
23
23
|
|
24
24
|
---
|
25
|
-
・下記に例として、シート1に指定した検索ワードの検索結果を表示するコードを記載します。
|
25
|
+
・下記に例として、シート1に指定した検索ワードの検索結果をログ表示するコードを記載します。
|
26
26
|
authorize()、authCallback()は変更していません。
|
27
27
|
main()以下を変更しています。
|
28
28
|
for文の中に関数が定義されている部分等も修正しています。
|
2
answer
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
|
24
24
|
---
|
25
25
|
・下記に例として、シート1に指定した検索ワードの検索結果を表示するコードを記載します。
|
26
|
-
authorize()、
|
26
|
+
authorize()、authCallback()は変更していません。
|
27
27
|
main()以下を変更しています。
|
28
28
|
for文の中に関数が定義されている部分等も修正しています。
|
29
29
|
|
1
answer
CHANGED
@@ -51,6 +51,9 @@
|
|
51
51
|
return twitter.authCallback(request);
|
52
52
|
}
|
53
53
|
|
54
|
+
// セルを取得
|
55
|
+
var sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1"); // 「シート1」はシート名
|
56
|
+
|
54
57
|
function main() {
|
55
58
|
// ① 検索ワードをスプレッドシートから取得する
|
56
59
|
var searchWords = pickUpSearchWords();
|