teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

9

対象行を修正

2021/11/15 00:33

投稿

退会済みユーザー
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
- + // ② Twitterで検索する
186
+ // ② Twitterで検索する
187
- + var tweetList = findTweets(searchWord, lastTweetId);
187
+ var tweetList = findTweets(searchWord, lastTweetId);
188
- +
188
+
189
- + // ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする
189
+ // ③ 複数件ツイートを取得されるので for を使って1つずつツイートを取り出し いいね or RT をする
190
- + for (var j = 0, jl = tweetList.length; j < jl; j++ ) {
190
+ for (var j = 0, jl = tweetList.length; j < jl; j++ ) {
191
- + var tweet = tweetList[j];
191
+ var tweet = tweetList[j];
192
- +
192
+
193
- + // 重複処理をしないように最新のツイートIDを保存する
193
+ // 重複処理をしないように最新のツイートIDを保存する
194
- + var titleRow = 1; // 『検索ワード』とか書いている部分の行数
194
+ var titleRow = 1; // 『検索ワード』とか書いている部分の行数
195
- + var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで
195
+ var lastTweetIdCol = 3; // 『最終TweetId』の列までなので3列目まで
196
- + var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる
196
+ var updateCell = sheetData.getRange(i + 1 + titleRow, lastTweetIdCol, 1, 1); // i = 0 の時1行目なので+1してる
197
- + updateCell.setValue(lastTweetId);
197
+ updateCell.setValue(lastTweetId);
198
- + }
198
+ }
199
199
  }
200
200
 
201
201
  // pickUpSearchWords()は、main()内にあっても問題なく動くが、他の関数から利用することを考えると外に出した方がよい。

8

2021/11/15 00:33

投稿

退会済みユーザー
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

2021/11/14 02:44

投稿

退会済みユーザー
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 titleRow = 1; // 『検索ワード』とか書いている部分の行数
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

2021/11/14 02:43

投稿

退会済みユーザー
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

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

2021/11/14 02:37

投稿

退会済みユーザー
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

修正

2021/11/14 02:35

投稿

退会済みユーザー
answer CHANGED
@@ -1,21 +1,28 @@
1
+ ・**認証が完了しているのであれば、
1
- ・認証が正常にできているのであれば、authorize()やauthCallback()には何の問題もありません。
2
+  authorize()やauthCallback()には何の問題もありません。**
3
+ ```text
2
- 「認証が正常にできている」とは
4
+ ここでの「認証が完了している」とは
3
-  authorize()関数を手動実行
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

2021/11/14 01:56

投稿

退会済みユーザー
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

2021/11/14 00:02

投稿

退会済みユーザー
answer CHANGED
@@ -23,7 +23,7 @@
23
23
 
24
24
  ---
25
25
  ・下記に例として、シート1に指定した検索ワードの検索結果を表示するコードを記載します。
26
- authorize()、anthCallback()は変更していません。
26
+ authorize()、authCallback()は変更していません。
27
27
  main()以下を変更しています。
28
28
  for文の中に関数が定義されている部分等も修正しています。
29
29
 

1

2021/11/14 00:00

投稿

退会済みユーザー
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();