🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

JavaScript

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

Q&A

解決済

3回答

2318閲覧

不要なカンマが出力されないようにしたい

SnowMonkey

総合スコア53

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2021/02/01 12:39

編集2021/02/01 15:26

実現したいこと&発生している問題

Spreadsheet上の英語のクイズ問題や正答を、毎日LINEのグループに投稿するシステムを作っています。
こちら(terarail)で相談したりして、概ね完成したのですが、
下記のように不要なカンマが入ってしまいます。
不要なカンマが入らないようにコードを修正するにはどうすればよいでしょうか
お知恵を拝借できれば幸いです。

イメージ説明

該当のソースコード

Spreadsheet上のA~E列にかけて
日付、問題番号、英語の問題文、日本語訳、正答が入力してあります。
イメージ説明

google

1//*******問題番号と正答を投稿するプログラム********** 2 3function postAnswers2LINE() { 4 5 //本日の日付を取得する 6 const today = new Date(); 7 8 //検索する範囲を指定する 9 const dataRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Index').getDataRange().getValues().slice(1); 10 //console.log(dataRange); 11 12 //今日の日付と先頭列に記入されている日付が一致しているレコードだけ抜き出す 13 let filtered= dataRange.filter(function(record){ 14 if(record[0].getFullYear() === today.getFullYear() && record[0].getMonth() === today.getMonth() && record[0].getDate() === today.getDate()){ 15 return true; 16 } 17 }); 18 //console.log(filtered); 19 20 //問題番号と正答だけにする(A列とE列の情報だけにする) 改行も入れる  21 let message = filtered.map(function(e) { return "\n"+e[1]+"\n"+e[4]+"\n";}); 22 23 24 //日付と初回、復習1~3回目のいずれかを冒頭に明示する 25 const title=today.getMonth()+1+"/"+today.getDate()+" "+"復習3回目の正答"; 26 message = title + message; 27 console.log(message); 28 29 //LINEに投稿する関数sendHttpPost_lineに変数messageを渡して起動する 30 sendHttpPost_line(message); 31 32} 33

###試したこと
配列に文字列を+で追加するのがまずいのかなと思って 下記の部分を

//日付と初回、復習1~3回目のいずれかを冒頭に明示する const title=today.getMonth()+1+"/"+today.getDate()+" "+"復習3回目の正答"; message = title + message;

以下のようにunshiftを使って書き直してみましたが、

const title=today.getMonth()+1+"/"+today.getDate()+" "+"復習3回目の正答"; const unshifted = message.unshift(title); console.log(message );

このようなログになり上手くいきません
[ '2/1 復習3回目の正答',
'\n1859\nIn\n',
'\n1856\nupper\n',
'\n1854\nbrain\n' ]

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

解決出来たようで良かったです。

1点注意していただきたいのが、
回答内容にカンマがあった場合です。
意図しない場所でも改行の可能性があります。
もし、回答にカンマが含まれる可能性があるようでしたら、別の実現方法をご検討ください。

投稿2021/02/01 22:36

WhiteTempest

総合スコア404

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

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

SnowMonkey

2021/02/01 23:19

ありがとうございます。ご指摘の通りです。 英文ですので、途中にカンマが入ることがあると思います。 その時には今回自己解決としたやり方では不要の改行が行われてしまいます。 解決済みとするのが早すぎました ((+_+))
WhiteTempest

2021/02/01 23:41

+でカンマが付与されるっぽいことを予想されていますが、 GASは&結合に対応していた気がします。 a + bではなく、a & bで結合してみては? ※+による結合だと、予期しない動きになることがあると思うので。
guest

0

ベストアンサー

joinにて連結させてはいかがでしょうか?

こちらがとても参考になると思います。
https://www.yukibnb.com/entry/gas_join#join%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%82%88%E3%81%86

また、それでも発生するようであれば、
スプレッドシート側のデータも添付いただければと思います。

投稿2021/02/01 13:38

WhiteTempest

総合スコア404

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

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

SnowMonkey

2021/02/01 22:02

アドバイスありがとうございます。 配列の区切り文字をすべて\nにできれば解決するだろうとの助言だと理解しました。 ご紹介いただいたHPでは、二次元配列の区切り文字を2段階で変えていっていましたので それに倣って該当箇所を変えてみました。 変更したことが分かりやすいよう区切り文字は&でやってみました。 ところが、2段階目の変換でjoinを使うと TypeError: message.join is not a functionとエラーメッセージが出てうまくいきません。 もう少し教えていただければ幸いです。 //問題番号と正答だけにする 改行を入れる let message = filtered.map(function(e) { return e[1]+"&"+e[4];}); console.log(message);//1892&in the shape,1891&work on,1889&basis of //日付と初回、復習1~3回目のいずれかを明示する const title=today.getMonth()+1+"/"+today.getDate()+" "+"復習3回目の正答"; message = title + message; console.log(message);//2/2 復習3回目の正答1892&in the shape,1891&work on,1889&basis of message = message.join("&"); console.log(message);//TypeError: message.join is not a function
SnowMonkey

2021/02/14 11:49

WhiteTempestさんの回答を受けて改めて考えなおしたところ、上手くいきました。いったん自己解決にしましたが、未解決に戻せることに気付き、ベストアンサーとさせていただきました。 //通し番号・日本語文・英語の問題だけにする 改行を入れる let message = filtered.map(function(e) { return e[1]+"\n"+e[2]+"\n"+e[3]+"\n";}).join("\n"); //日付と初回、復習1~3回目のいずれかを明示する const title=today.getMonth()+1+"/"+today.getDate()+" "+"復習2回目の問題"; message = title +"\n" + message; //console.log(message );
WhiteTempest

2021/02/16 12:37

お返事遅れてすみません。 見返してみましたが、 こんなのでも行けると思います。 ご参考までに。 //e1,e2,e3を含んだ一次元配列の作成 var messages = let message = filtered.map(function(e) { return [e[1],e[2],e[3];}); ★このreturnで配列返すところは、arrayにしないと、エラーになるかも? title=today.getMonth()+1+"/"+today.getDate()+" "+"復習2回目の問題"; //先頭にタイトルを入れる messages.unshift(title); //一次元配列の中身を改行コードで連結し、ログ出力する console.log(messages.join("\n")); 動作確認していないので、雰囲気だけにはなりますが。。。 ご参考までに。
guest

0

replaceを用いて、カンマを改行に置き換えることでうまくいきました。

Google

1 //問題番号と正答だけにする 改行を入れる 2 let message = filtered.map(function(e) { return e[1]+"\n"+e[4]+"\n";}); 3 console.log("message:"+"\n"+message); 4 5 //日付と初回、復習1~3回目のいずれかを明示する 6 const title=today.getMonth()+1+"/"+today.getDate()+" "+"復習3回目の正答"; 7 message = title+"\n" + message; 8 console.log(message); 9 10 message = message.replace(/,/g, "\n"); 11 console.log(message); 12

投稿2021/02/01 22:29

SnowMonkey

総合スコア53

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問