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

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

新規登録して質問してみよう
ただいま回答率
85.44%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

1回答

15818閲覧

GASで構文エラー[Unexpected end of input]を解消したい!

todomaru

総合スコア5

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

0クリップ

投稿2020/02/16 14:30

編集2020/02/16 17:00

前提・実現したいこと

C言語の基礎を少し学んだくらいの未熟者ですがよろしくお願いいたします。
本題ですが、
「slackにあげたファイルをslackではなくGoogledriveに転送・保存することです。」
下記のサイトにまとめてありましたので参考にさせていただきましたが、
真似できなかったため質問させていただきます。
https://qiita.com/GMA/items/7e3e7cedcb880f2c1dc9

発生している問題・エラーメッセージ

かっこの数とスペルを確認したつもりですが、最終行にエラーが出てしまって
ウェブアプリケーションのURLが作成されなくて困っております。
行137とは最終行の}の部分になります。
普通に実行できない原因をわかりたいです!!!

SyntaxError: Unexpected end of input(行 137、ファイル「・・・・.gs」)

該当のソースコード

GAS

1function doPost(e){ 2 var params=JSON.parse(e.postData.getDataAsString()); 3 if(params.type==="url_verification"){ 4 return ContentService.createTextOutput(params.challenge); 5 } 6 if(params.event.type==="file_shared"){movefiles(params); 7} 8 return ContentService.createTextOutput('ok'); 9} 10 11 12function moveFiles(params){ 13 var notCopyType=["text","c"]; 14 var scriptProperties=PropertiesService.getScriptProperties(); 15 var slackAccessToken=scriptPtoperties.getProperty("****-***********-************-************-**************************"); 16 var folderid=scriptProperties.getProperty("****************************"); 17 try{ 18 var fileId=params.event.file_id; 19 var userId=params.event.user_id; 20 var userResponce=UrlFetchApp.fetch('https://slack.com/api/users.info?token='+slackAccessToken+'&user='+userId); 21 var userInfo=JSON.parse(userResponse.getContentText()); 22 var userName=userInfo.user.name; 23 var displayName=userInfo.user.profile.display_name; 24 if(displayName===""){ 25 displayName=userInfo.user.profile.real_name; 26 } 27 var fileResponse=UrlFetchApp.fetch('https://slack.com/api/files.info?token='+slackAccessToken+'&file='+fileId); 28 var fileInfo=JSON.parse(fileResponse.getContentText()); 29 if(finleInfo.file.external_type=='gdrive'){ 30 return; 31 } 32 if(fileInfo.file.size>50000000){ 33 return; 34 } 35 var dlUrl=fileInfo.file.url_private; 36 var fileType=fileInfo.file.filetype; 37 for(i in notCopyType){ 38 if(fileType==notCopyType[i]){ 39 return; 40 } 41 } 42 var headers={ 43 "method":"GET", 44 "geaders":heaeders 45 }; 46 var dlData=UrlFetchApp.fetch(dlUrl,params2).getBlob(); 47 var rootFolder=DriveApp.getFolderById(folderId); 48 var targetFolder=rootFolder.getFoldersByName(userName+"_slackItems"); 49 if(targetFolder.hasNext()==false){ 50 var targetFolderId=rootFolder.createFolder(userName+"_slackItems"); 51 }else{ 52 var targetFolderId=DriveApp.getFoldById(targetFolder.next().getId()); 53 } 54 dlData.setName(fileInfo.file.name); 55 var drive=targetFolderId.createFile(dlData); 56 driveFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.VIEW); 57 Utilities.sleep(100); 58 59 //スラックにリンクを張る処理 60 61 var shares=fileInfo.file.shares; 62 for(key in shares){ 63 foo=shares[key]; 64 postType=key; 65 break; 66 } 67 for(key in shares){ 68 foo=shares[key]; 69 channelId=key; 70 break; 71 } 72 var th_ts=0.0; 73 var ts=0.0; 74 for(key in bar[0]){ 75 if(key=="thread_ts"){ 76 th_ts==bar[0][key]; 77 } 78 } 79 var message =displayName+'さんが'+fileInfo.file.name+'を共有しました!/n'+drivefile.getUrl(); 80 if(ts !=0.0){ 81 var historyResponse=UrlFetchApp.fetch('https://slack.com/api/channels.history?token='+slackAccessToken+'&channel='+channelId+'&count=1&latest='+ts+'&oldest='+ts+'&inclusive=true'); 82 var historyInfo=JSON.parse(historyResponse.getContentText()); 83 message=messame+'\n\n'+historyInfo.messages[0].text; 84 var delparams={ 85 'token':slackAccessToken, 86 'channel':channelId, 87 'ts':ts, 88 'as_user':false 89 }; 90 var deloptions={ 91 'method':'POST', 92 'payload':delparams 93 }; 94 UrlFetchApp.fetch('https://slack.com/api/chat.delete',deloptions); 95 } 96 if(th_ts !=0.0){ 97 postText(slackAccessToken,channelId,message,th_ts); 98 }else{ 99 postText(slackAccessToken,channelId,message); 100 } 101 //スラック上のファイルを削除 102 var params={ 103 'token':slackAccessToken, 104 'file':fileId 105 }; 106 var options={ 107 'method':'POST', 108 'payload':params 109 }; 110 try{ 111 var res =UrlFetchApp.fetch('http://slack.com/api/files.delete',options); 112 }catch(e){ 113 postText(slackAccessToken,channelId,'Error:'+e); 114 } 115function postText (token,channel,txt,th_ts){ 116 if(th_ts==undefined){ 117 var params={ 118 'token':token, 119 'channel':channel, 120 'text':txt, 121 'as_user':false 122 }; 123 }else{ 124 var params={ 125 'token':token, 126 'channel':channel, 127 'text':txt, 128 'as_user':false, 129 'thread_ts':th_ts 130 }; 131 } 132var options={ 133 'method':'POST', 134 'payload':params 135}; 136 UrlFetchApp.fetch('https://slack.com/api/chat.postMessage', options); 137}

試したこと

・途中のcatchのところでおそらくリンク先の作成者様がコードの打ち間違えているのではないかと思い、tryを用いたところ、その場所のエラーは解消されました。(ここが原因かもしれません。)
・スペル、【】は確認したつもりです、、
・84行目からも同じ作業を行っていると思うのですが、コードの記入に違いはないのかと確認いたしました。

補足情報(FW/ツールのバージョンなど)

2020/2/16にGASをインストールしました。

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

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

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

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

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

dodox86

2020/02/16 15:11

アクセストークンのようなユーザー情報に関わるものは、そのまま直接載せるのではなく、ダミー値に置き換えるなどしてください。質問文を書き直した後、アクセストークンも変更しましょう。
dodox86

2020/02/16 15:55

"Java"、"C"のタグが付いていますが、本質問に関係なく、不適切だと思うので外しましょう
todomaru

2020/02/16 16:14

ご指摘ありがとうございます。 該当のタグは今外します。申し訳ないです。 頂いた回答の方も確認してみます。 迅速な対応ありがとうございます!!!
guest

回答1

0

ベストアンサー

普通に実行できない原因をわかりたいです

実行の前に、スクリプト中のカッコの数が合っていないので文法エラーの段階です。
具体的にはmoveFiles関数中で、tryに対するcatch節が無いのと、関数最後の閉じカッコがありません。この手の間違いはコーディング時にインデント(字下げ)を丁寧に行えばほとんど防げます。
質問者さんのオリジナルのコードはインデントが壊れている部分がいくつかあり、見た目で分かりづらいです。

とりあえず文法エラーが無くなるように修正したのが以下、です。**<追加>:**の部分を参照してください。

GAS

1function moveFiles(params){ 2 var notCopyType=["text","c"]; 3 var scriptProperties=PropertiesService.getScriptProperties(); 4 var slackAccessToken=scriptPtoperties.getProperty("0000-000000000000-000000000000-000000000000-00000000000000000000000000000000"); 5 var folderid=scriptProperties.getProperty("111111111111111111111111111111111"); 6 try{ 7 var fileId=params.event.file_id; 8 var userId=params.event.user_id; 9 var userResponce=UrlFetchApp.fetch('https://slack.com/api/users.info?token='+slackAccessToken+'&user='+userId); 10 var userInfo=JSON.parse(userResponse.getContentText()); 11 var userName=userInfo.user.name; 12 var displayName=userInfo.user.profile.display_name; 13 if(displayName===""){ 14 displayName=userInfo.user.profile.real_name; 15 } 16 // <追加>: このtry節を閉じるcatch節が無い - この場所で良いかは判断してください。 17 } catch (ex) { 18 ; 19 } 20 21 var fileResponse=UrlFetchApp.fetch('https://slack.com/api/files.info?token='+slackAccessToken+'&file='+fileId); 22 var fileInfo=JSON.parse(fileResponse.getContentText()); 23 if(finleInfo.file.external_type=='gdrive'){ 24 return; 25 } 26 if(fileInfo.file.size>50000000){ 27 return; 28 } 29 var dlUrl=fileInfo.file.url_private; 30 var fileType=fileInfo.file.filetype; 31 for(i in notCopyType){ 32 if(fileType==notCopyType[i]){ 33 return; 34 } 35 } 36 var headers={ 37 "method":"GET", 38 "geaders":heaeders 39 }; 40 var dlData=UrlFetchApp.fetch(dlUrl,params2).getBlob(); 41 var rootFolder=DriveApp.getFolderById(folderId); 42 var targetFolder=rootFolder.getFoldersByName(userName+"_slackItems"); 43 if(targetFolder.hasNext()==false){ 44 var targetFolderId=rootFolder.createFolder(userName+"_slackItems"); 45 }else{ 46 var targetFolderId=DriveApp.getFoldById(targetFolder.next().getId()); 47 } 48 dlData.setName(fileInfo.file.name); 49 var drive=targetFolderId.createFile(dlData); 50 driveFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.VIEW); 51 Utilities.sleep(100); 52 53 //スラックにリンクを張る処理 54 55 var shares=fileInfo.file.shares; 56 for(key in shares){ 57 foo=shares[key]; 58 postType=key; 59 break; 60 } 61 for(key in shares){ 62 foo=shares[key]; 63 channelId=key; 64 break; 65 } 66 var th_ts=0.0; 67 var ts=0.0; 68 for(key in bar[0]){ 69 if(key=="thread_ts"){ 70 th_ts==bar[0][key]; 71 } 72 } 73 var message =displayName+'さんが'+fileInfo.file.name+'を共有しました!/n'+drivefile.getUrl(); 74 if(ts !=0.0){ 75 var historyResponse=UrlFetchApp.fetch('https://slack.com/api/channels.history?token='+slackAccessToken+'&channel='+channelId+'&count=1&latest='+ts+'&oldest='+ts+'&inclusive=true'); 76 var historyInfo=JSON.parse(historyResponse.getContentText()); 77 message=messame+'\n\n'+historyInfo.messages[0].text; 78 var delparams={ 79 'token':slackAccessToken, 80 'channel':channelId, 81 'ts':ts, 82 'as_user':false 83 }; 84 var deloptions={ 85 'method':'POST', 86 'payload':delparams 87 }; 88 UrlFetchApp.fetch('https://slack.com/api/chat.delete',deloptions); 89 } 90 if(th_ts !=0.0){ 91 postText(slackAccessToken,channelId,message,th_ts); 92 }else{ 93 postText(slackAccessToken,channelId,message); 94 } 95 //スラック上のファイルを削除 96 var params={ 97 'token':slackAccessToken, 98 'file':fileId 99 }; 100 var options={ 101 'method':'POST', 102 'payload':params 103 }; 104 try{ 105 var res =UrlFetchApp.fetch('http://slack.com/api/files.delete',options); 106 }catch(e){ 107 postText(slackAccessToken,channelId,'Error:'+e); 108 } 109} // <<追加>>: 閉じカッコが無い

コードが実際に(質問者さんが希望する)動作をするかどうかは分かりませんので注意してください。そこはご質問の範囲外と思いましたので、動作未確認です。

投稿2020/02/16 15:50

dodox86

総合スコア9185

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

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

todomaru

2020/02/16 16:38

文法エラーの添削ありがとうございます! 実行の方が出来ましたのでこの質問は解決とさせていただきます。 さらに、私自身でやりたいことが出来るようにやってみます!(dodox86さんの直してくださったコードで完成されているかもしれませんが、、) また躓いたときはよろしくお願いしたいです!ありがとうございました!
dodox86

2020/02/16 16:40

お役に立てたようで良かったです。ご要望のものが完成できるよう、引き続きがんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問