質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

1回答

3488閲覧

GASでトリガーからの引数を思った関数に渡す方法

Egoil

総合スコア18

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2019/06/23 17:24

GASで競技プログラミングの順位付けを行うプログラムを書いているのですが、冗長になっている部分を別関数にしてくくり出すと
LINE APIのreplyが使えなくなりました。
自分がLINE上でキーワードを言ったらその時点での直近の大会の順位を吐いてくれる仕組みです。
具体的にLogger. logなどでログを取ってみましたが何も現れないので恐らく関数に引数が渡っていないのだと推測しているのですが、どうでしょうか。
GASにはMain関数などがないので上から順番に関数が実行されていくのでしょうか。そしたら、一番上の関数が引数を取っていた場合ラインから送ったメッセージのJSONファイルはその引数として渡ってしまい下の方の関数には行き渡らないのでしょうか。
私が書いているコードは現時点で以下のようなものです。
複数の関数に引数が要求されているためにおかしくなっているのだとしたら、一つの関数として書いてしまうべきですか?

mmmmやllllなどはAtCoderの仮のユーザネームです。

GAS

1var CHANNEL_ACCESS_TOKEN = ''; 2var ACCESS_TOKEN = ''; 3var USER_ID = ''; 4var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; 5var player_array = []; 6 7function doPost(e) { 8Logger.log('yahhoo'); 9 // LINE developersのメッセージ送受信設定に記載のアクセストークン 10 var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; 11 var userMessage = JSON.parse(e.postData.contents).events[0].message.text; 12 13Logger.log(userMessage); 14 //基準としてmmmmが参加したコンテストデータの最新のコンテストで比較する。 15 var fetch_mmmm = UrlFetchApp.fetch("https://atcoder.jp/users/mmmm/history/json"); 16 17 //isRatedを取得 18 var isRated = JSON.parse(fetch_mmmm)[fetch_mmmm.length - 1].isRated; 19 20 //キーワードを言わないと発動しない。Ratedじゃないと発動しない。 21 if(userMessage !== 'リザルト' || isRated === false){ 22 return; 23 } 24 Logger.log("line32"); 25 26//順位付けしたいUserのパフォーマンスと参加したか否かの情報(つまりコンテストネーム)を取ってくる.ハードコーディングなので後で治す。スプレッドシートに名前書き込む感じでいいかも。 27 getPerformance('mmmm'); 28 getPerformance('llll'); 29 getPerformance('ooooo'); 30 getPerformance('pppppp'); 31 getPerformance('qqqq'); 32 getPerformance('rrrrr'); 33 34 35 //大会参加してないやつはパフォ0なのでmmmmがすべての大会に参加していると仮定してみんな参加しているか否かをチェック。 36 for ( var i = 1; i < player_array.length; i++ ) { 37 if(player_array[i][2] !== player_array[0][2]){ 38 player_array[i][1] = 0; 39 } 40 } 41 42 //パフォーマンスでソート 43 player_array.sort(function(a,b){return(a[1] - b[1]);}); 44 45 //送るテキストの文字列をMessageに入れる 46 var Message = player_array[0][2]; //コンテスト名 47 for(var j=1; j<player_array.length + 1; j++){ 48 Message = Message + '\n ' + String(j) + ':' +player_array[j-1][0] +'パフォ'+ player_array[j-1][1] ; 49 } 50 51 52 var url = 'https://api.line.me/v2/bot/message/reply'; 53 54 UrlFetchApp.fetch(url, { 55 'headers': { 56 'Content-Type': 'application/json; charset=UTF-8', 57 'Authorization': 'Bearer ' + ACCESS_TOKEN, 58 }, 59 'method': 'post', 60 'payload': JSON.stringify({ 61 'replyToken': replyToken, 62 'messages': [{ 63 'type': 'text', 64 'text': Message, 65 }], 66 }), 67 }); 68 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 69} 70 71 72function getPerformance(name){ 73 var fetch = UrlFetchApp.fetch("https://atcoder.jp/users/"+name+"/history/json"); 74 var Performance = JSON.parse(fetch)[fetch.length - 1]["Performance"]; 75 var ContestName = JSON.parse(fetch)[fetch.length - 1].ContestName; 76 77 player_array.push([name,Performance,ContestName]); 78}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/06/23 22:38

引数は関係ない。post されたとにきのエントリポイントとしてmainの代わりにdoPostがある
macaron_xxx

2019/06/24 01:28

おそらくgetPerfomanceが非同期処理なので、player_arrayに情報が入る前に処理が進んでいってるんじゃないかなぁ、と思うんですが、どうでしょ。
guest

回答1

0

javascript

1for(var j=1; j<player_array.length + 1; j++){

少なくともここで配列の長さ+1未満で実行すると、配列の境界の外を参照してエラーになる。
単に+1をとってください

投稿2019/06/23 22:36

編集2019/06/24 03:37
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaron_xxx

2019/06/24 00:53

player_array.length - 1にする必要はなく、単純にplayer_array.lengthでいいはずですよ。
papinianus

2019/06/24 03:36

ご指摘ありがとうございます。確かに無意味でしたね。混乱していたようです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問