はじめに
今回のビジボットも、『GASの完全入門 基礎』の復習をしたいなと思って練習したのですが、別のところにこだわりが半端なくなってしまい、全然復習になららなかったです!(笑)
いや、全然って言う割ですが、意外とこうやってかけばいいんだ。この場合はこうするんだ。っていうのがわかってきました。
今日だけでは足りないので、明日も復習をしっかりやっていきます
それでは始めていきます!
1.作りたいもの
人をオブジェクトのコンストラクタとして昨日は勉強したので、『ヒューマン』を型として作ってみようと思いました。
まず、それぞれのJOBごとに必要な情報をまとめてみました。
画像データは以下サイトにて、お借りしました。ありがとうございます!
https://hiyokoyarou.com/tag/%E6%AD%A6%E5%99%A8/
person1
名前:フォースに好かれたチョン
JOB:フォース
HP:15
MP:10
こうげきりょく:15
ぼうぎょりょく:8
かしこさ:8
性格:おっちょこちょい
紹介
月に旅行に行った際に買ってきた温泉のおみやげ。
振るたびに『ボォオン』と音がなる。
暗い夜道を照らすのにちょうどいい。
=IMAGE(“http://drive.google.com/uc?export=view&id=1MDtpx5sHbcwB0q6j_oKVUWWXRgcTkWPQ”)
person2
名前:花の剣士チュン
JOB:剣士
HP:12
MP:15
こうげきりょく:10
ぼうぎょりょく:7
かしこさ:12
性格:おっとり
紹介
盾を使った行動がメイン。主に盾で殴る事が得意。盾以外で得意な事と言ったら花魔法を使える事。花魔法で相手を乗り物酔いにさせる事ができる。しかし、相手が乗り物酔いをしない場合は効果がない。
=IMAGE(“http://drive.google.com/uc?export=view&id=18CccewciUSEB5vwgKHr_o67qAA26OCQX”)
person3
名前:スナイパーチェン
JOB:銃
HP:14
MP:6
こうげきりょく:15
ぼうぎょりょく:8
かしこさ:12
性格:しっかりもの
紹介
こう見えて目が悪く、射撃の命中率は5割がいいところ。しかし、あまりに外しすぎると目に頼ることをやめ、目を閉じたまま寝てしまう。寝る事で消費した体力と精神的ダメージは回復するが、反省はしない。
=IMAGE(“http://drive.google.com/uc?export=view&id=1tQyFkcam9pNw0hU0t78OTd1EtMyL3ett”)
person4
名前:大魔導士ツン
JOB:賢者
HP:30
MP:50
こうげきりょく:10
ぼうぎょりょく:10
かしこさ:70
性格:うっかりもの
紹介
ぼーっと空を眺める事が好きな大魔導士ツン。しかし戦闘が始まれば人が変わったように戦う姿はまるで魔人と変わらない。
この大陸にその名を知らぬものはいないと言われている。
=IMAGE(“http://drive.google.com/uc?export=view&id=1htSnToHtJp9kd8ryM1xlSNzZAu9EFODZ”)
person5
名前:勇者見習いテン
JOB:勇者見習い
HP:13
MP:8
こうげきりょく:13
ぼうぎょりょく:12
かしこさ:10
性格:おちょうしもの
紹介
勇者のお兄ちゃんに憧れを抱く勇者見習いのテン。一生懸命お兄ちゃんの背中を追うが、彼は腹違いの子。勇者の血を引いていない事を知らない。しかし、彼は努力の天才で後に英雄となる。
=IMAGE(“http://drive.google.com/uc?export=view&id=1Rv7bibyCSxE5kxRySZRES23MyZzK4IU_”)
person6
名前:勇者アルスト
JOB:勇者
HP:50
MP:20
こうげきりょく:50
ぼうぎょりょく:25
かしこさ:20
性格:やさしい
紹介
ある日、大魔王ゾーマゾを倒すため旅に出る事になった勇者アルスト。光の弾を追い求め東の地を目指している。
彼はこの世の全ての希望であり、光である。
=IMAGE(“http://drive.google.com/uc?export=view&id=1tDWLsohVcgbKCsRBy0PoJIB6x2KYP79g”)
※IMAGE関数でGoogleDriveに入っているデータを呼び出してスプレッドシート上に表示します
2.実行画面
スプレッドシートのセル面積を小さくして、ドット絵っぽくしてみました!(笑)しかし、これが動くとかではないので、残念なのですが『▶︎ぼうけんをはじめる』をクリックすると名前を聞かれます。

クリックすると以下ウィンドウが立ち上がります。

名前を入力すると、JOBを選択する画面が表示されます。
ここに表示されている6つのJOBを選択して、入力フォームに入れます。

すると、2つ目の『キャラ』シートに画面が切り替わり、キャラクターの詳細情報が表示されます。

3.コード
全体で使っているソースコードです。
インスタンスや、コンストラクタや、prototypeを使った練習したかったんですが、色々時間の問題もあり思うようにできませんでした。。(笑)
だけど、この記述練習でも得た事がたくさんあったので、さらに明日へ繋げていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
function onOpen(){ var yName = Browser.inputBox('あなたの名前は?'); if (yName !== 'cancel'){ var job = Browser.inputBox('こんにちは、' + yName + 'さん。\\n\\nこれからCHIKIN QUESTの世界に出発するために、あなたの代わりにプレーをするキャラクターを選択します。\\nJOBを以下から選択してください。\\n\\nフォース 剣士 銃 賢者 勇者見習い 勇者'); selectJob(job); } } var Person = function(psn){ name = psn[0][1]; job = psn[1][1] hp = psn[2][1]; mp = psn[3][1]; atc = psn[4][1]; def = psn[5][1]; int = psn[6][1]; per = psn[7][1]; url = psn[8][1]; desc = psn[9][1]; }; Person.prototype.msg = function(){ Logger.log(name); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh1 = ss.setActiveSheet(ss.getSheetByName("スタート")); var sh2 = ss.setActiveSheet(ss.getSheetByName("キャラ")); sh2.getRange(1,2).setValue(name); sh2.getRange(3,2).setValue(hp); sh2.getRange(4,2).setValue(mp); sh2.getRange(5,2).setValue(atc); sh2.getRange(6,2).setValue(def); sh2.getRange(7,2).setValue(int); sh2.getRange(8,2).setValue(per); sh2.getRange(2,2).setValue(url); sh2.getRange(9,2).setValue(desc); }; function selectJob(job){ Logger.log(job); if(job === 'フォース'){ var personArr = [ ['name','フォースに好かれたチョン'], ['job','フォース'], ['hp',15], ['mp',10], ['atc',15], ['def',8], ['int',8], ['per','おっちょこちょい'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1MDtpx5sHbcwB0q6j_oKVUWWXRgcTkWPQ")'], ['desc','ある日、大魔王ゾーマゾを倒すため旅に出る事になった勇者アルスト。光の弾を追い求め東の地を目指している。彼はこの世の全ての希望であり、光である。'] ]; }else if(job === '剣士'){ var personArr = [ ['name','花の剣士チュン'], ['job','剣士'], ['hp',12], ['mp',15], ['atc',10], ['def',7], ['int',12], ['per','おっとり'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=18CccewciUSEB5vwgKHr_o67qAA26OCQX")'], ['desc','盾を使った行動がメイン。主に盾で殴る事が得意。盾以外で得意な事と言ったら花魔法を使える事。花魔法で相手を乗り物酔いにさせる事ができる。しかし、相手が乗り物酔いをしない場合は効果がない。'] ]; }else if(job === '銃'){ var personArr = [ ['name','スナイパーチェン'], ['job','銃'], ['hp',14], ['mp',6], ['atc',15], ['def',8], ['int',12], ['per','しっかりもの'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1tQyFkcam9pNw0hU0t78OTd1EtMyL3ett")'], ['desc','こう見えて目が悪く、射撃の命中率は5割がいいところ。しかし、あまりに外しすぎると目に頼ることをやめ、目を閉じたまま寝てしまう。寝る事で消費した体力と精神的ダメージは回復するが、反省はしない。']]; }else if(job === '賢者'){ var personArr = [ ['name','大魔導士ツン'], ['job','賢者'], ['hp',30], ['mp',50], ['atc',10], ['def',10], ['int',70], ['per','おっちょこちょい'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1htSnToHtJp9kd8ryM1xlSNzZAu9EFODZ")'], ['desc','ぼーっと空を眺める事が好きな大魔導士ツン。しかし戦闘が始まれば人が変わったように戦う姿はまるで魔人と変わらない。この大陸にその名を知らぬものはいないと言われている。']]; }else if(job === '勇者見習い'){ var personArr = [ ['name','勇者見習いテン'], ['job','勇者見習い'], ['hp',13], ['mp',8], ['atc',13], ['def',12], ['int',10], ['per','おちょうしもの'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1Rv7bibyCSxE5kxRySZRES23MyZzK4IU_")'], ['desc','勇者のお兄ちゃんに憧れを抱く勇者見習いのテン。一生懸命お兄ちゃんの背中を追うが、彼は腹違いの子。勇者の血を引いていない事を知らない。しかし、彼は努力の天才で後に英雄となる。']]; }else if(job === '勇者'){ var personArr = [ ['name','勇者アルスト'], ['job','勇者'], ['hp',50], ['mp',20], ['atc',50], ['def',25], ['int',20], ['per','やさしい'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1tDWLsohVcgbKCsRBy0PoJIB6x2KYP79g")'], ['desc','ある日、大魔王ゾーマゾを倒すため旅に出る事になった勇者アルスト。光の弾を追い求め東の地を目指している。彼はこの世の全ての希望であり、光である。']]; } var person = new Person(personArr); Logger.log(person.msg()); } |
4.コードの説明
まずはトリガーにポップアップウィンドウを表示する関数をセットして、クリックで実行されるように以下コードをセットしておく。
以下で、名前やJOBを選択させ、JOBの情報を引数としてselectJob()関数を呼び出す。
1 2 3 4 5 6 7 8 |
function onOpen(){ var yName = Browser.inputBox('あなたの名前は?'); if (yName !== 'cancel'){ var job = Browser.inputBox('こんにちは、' + yName + 'さん。\\n\\nこれからCHIKIN QUESTの世界に出発するために、あなたの代わりにプレーをするキャラクターを選択します。\\nJOBを以下から選択してください。\\n\\nフォース 剣士 銃 賢者 勇者見習い 勇者'); selectJob(job); } } |
ここで、一致するJOBの情報を取得する。
本来DBに各personの情報があれば、それを取得して1つのpersonとしてセットする事ができるが、今回DBは関係ないため全て情報をセットする必要があります。
そして、var person = new Person(personArr);で、インスタンスを生成して、記述しているPersonコンストラクタが呼び出されます。
※一致しない場合の条件はまだ入れてないです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
function selectJob(job){ Logger.log(job); if(job === 'フォース'){ var personArr = [ ['name','フォースに好かれたチョン'], ['job','フォース'], ['hp',15], ['mp',10], ['atc',15], ['def',8], ['int',8], ['per','おっちょこちょい'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1MDtpx5sHbcwB0q6j_oKVUWWXRgcTkWPQ")'], ['desc','ある日、大魔王ゾーマゾを倒すため旅に出る事になった勇者アルスト。光の弾を追い求め東の地を目指している。彼はこの世の全ての希望であり、光である。'] ]; }else if(job === '剣士'){ var personArr = [ ['name','花の剣士チュン'], ['job','剣士'], ['hp',12], ['mp',15], ['atc',10], ['def',7], ['int',12], ['per','おっとり'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=18CccewciUSEB5vwgKHr_o67qAA26OCQX")'], ['desc','盾を使った行動がメイン。主に盾で殴る事が得意。盾以外で得意な事と言ったら花魔法を使える事。花魔法で相手を乗り物酔いにさせる事ができる。しかし、相手が乗り物酔いをしない場合は効果がない。'] ]; }else if(job === '銃'){ var personArr = [ ['name','スナイパーチェン'], ['job','銃'], ['hp',14], ['mp',6], ['atc',15], ['def',8], ['int',12], ['per','しっかりもの'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1tQyFkcam9pNw0hU0t78OTd1EtMyL3ett")'], ['desc','こう見えて目が悪く、射撃の命中率は5割がいいところ。しかし、あまりに外しすぎると目に頼ることをやめ、目を閉じたまま寝てしまう。寝る事で消費した体力と精神的ダメージは回復するが、反省はしない。']]; }else if(job === '賢者'){ var personArr = [ ['name','大魔導士ツン'], ['job','賢者'], ['hp',30], ['mp',50], ['atc',10], ['def',10], ['int',70], ['per','おっちょこちょい'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1htSnToHtJp9kd8ryM1xlSNzZAu9EFODZ")'], ['desc','ぼーっと空を眺める事が好きな大魔導士ツン。しかし戦闘が始まれば人が変わったように戦う姿はまるで魔人と変わらない。この大陸にその名を知らぬものはいないと言われている。']]; }else if(job === '勇者見習い'){ var personArr = [ ['name','勇者見習いテン'], ['job','勇者見習い'], ['hp',13], ['mp',8], ['atc',13], ['def',12], ['int',10], ['per','おちょうしもの'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1Rv7bibyCSxE5kxRySZRES23MyZzK4IU_")'], ['desc','勇者のお兄ちゃんに憧れを抱く勇者見習いのテン。一生懸命お兄ちゃんの背中を追うが、彼は腹違いの子。勇者の血を引いていない事を知らない。しかし、彼は努力の天才で後に英雄となる。']]; }else if(job === '勇者'){ var personArr = [ ['name','勇者アルスト'], ['job','勇者'], ['hp',50], ['mp',20], ['atc',50], ['def',25], ['int',20], ['per','やさしい'], ['url','=IMAGE("http://drive.google.com/uc?export=view&id=1tDWLsohVcgbKCsRBy0PoJIB6x2KYP79g")'], ['desc','ある日、大魔王ゾーマゾを倒すため旅に出る事になった勇者アルスト。光の弾を追い求め東の地を目指している。彼はこの世の全ての希望であり、光である。']]; } var person = new Person(personArr); Logger.log(person.msg()); } |
Personコンストラクタは取得したJOBのpersonデータを引数に処理を取得していきます。
ここで本当はthisを使いたかったのですが、配列の場合の取得方法がどうしてもエラーになってしまい断念しまいました。。。
そして、コンストラクタが実行終わると、呼び出し元(インスタンスした関数)に戻り、『Logger.log(person.msg());』が実行されます。
1 2 3 4 5 6 7 8 9 10 11 12 |
var Person = function(psn){ name = psn[0][1]; job = psn[1][1] hp = psn[2][1]; mp = psn[3][1]; atc = psn[4][1]; def = psn[5][1]; int = psn[6][1]; per = psn[7][1]; url = psn[8][1]; desc = psn[9][1]; }; |
ここではインスタンスする必要のないデータをprototypeプロパティとして扱っています。インスタンスの中にいれちゃうと余計なメモリを食ってしまうから。
そこに関してはできたのか?という疑問と、これでいいのか?という疑いしかありません。。(笑)
ここで、キャラシートの情報をセットしていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Person.prototype.msg = function(){ Logger.log(name); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh1 = ss.setActiveSheet(ss.getSheetByName("スタート")); var sh2 = ss.setActiveSheet(ss.getSheetByName("キャラ")); sh2.getRange(1,2).setValue(name); sh2.getRange(3,2).setValue(hp); sh2.getRange(4,2).setValue(mp); sh2.getRange(5,2).setValue(atc); sh2.getRange(6,2).setValue(def); sh2.getRange(7,2).setValue(int); sh2.getRange(8,2).setValue(per); sh2.getRange(2,2).setValue(url); sh2.getRange(9,2).setValue(desc); }; |
以上で本日は終わりです!
ExcelだとRPGがVBAでできるみたいですが、GASだったらどういったゲームが作れるか、ちょっとトライしてみたいなと感じました。
最後までお付き合い頂きありがとうございました!