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}