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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

795閲覧

【GAS】二次元配列で列単位でのIF条件設定方法

donguriko

総合スコア30

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2022/11/26 05:42

編集2022/11/26 05:53

前提

次の3つのスプレッドシートファイルがあります。
1)全体票
2)個票ひな形
3)個票ひな形のコピー

1)のイメージ
イメージ説明

2)のイメージ 一部抜粋
イメージ説明

実現したいこと

a:ファイル1)のB列にチェックを入れ、GAS実行すると、
指定フォルダ内にファイル2)をコピーしたファイル3)を作成する。
ファイル1)のD列、E列にファイル3)のファイルID、URLを転記する。
(複数行にチェックありの時には、複数ファイルを生成)

b:ファイル3)のファイル名を指定ファイル名に変更し、
ファイル3)のいくつかの項目内容をファイル1)から転記する。
(複数行にチェックありの時には、各ファイルに対し、同処理)

c:処理が完了したら、ファイル1)のC列にタイムスタンプを追記する。
最後に処理終了のポップアップメッセージを表示する。

d:処理の際、b列のどこにもチェックがなかった場合には、
処理中断する旨のポップアップメッセージを表示し、処理終了。

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

dの処理がうまくできず困っています。
どのようにコード修正すればよいかアドバイスが欲しいです。

以下の方法でファイル1)の「b列のどこにもチェックがなかった」判別
をさせようと試みました。

(試みた方法)
二次元配列fromDetaの各行から一番はじめの要素0? 1? flagのみを
spliceで抽出し、新たな配列flagArrを作成。
if条件で flagArr === false の時に、処理中止のメッセージを表示させ、
ループから抜ける想定。

<困っていること①>
console.log()で確認すると、flagArrの配列は取得自体はできている
ようなのですが、false3つ以外に想定していなかった後ろに' 'の要素が
いくつもついてきてしまい、spliceで抜きだしたいと思っていた通りに
抜けてきていないようです。
ちなみにconsole.log()でtargetRows想定通りの3となっています。
二次元配列の特定列の削除(抽出)の方法は、以前教えていただいた下リンク先
を参照しました。

以前の照会リンク

<困っていること②>
dの処理が失敗しているから、なのかもしれないですが、
「b列のどこにもチェックがなかった」場合でも、正常に処理終了したときの
メッセージが表示されてしまいます。
「b列のどこにもチェックがなかった」場合は、「処理終了」メッセージのみ
表示させ正常処理のメッセージは表示させないようにしたいのですが、
どのようにコード修正すればよいかアドバイスが欲しいです。

該当のソースコード

以下、コード全文記載します。
もし、ココをこう修正するともっとすっきりとわかりやすいコードになる、
というアドバイスがあれば併せてご教示いただけると助かります。

GAS

1function createIndvSS() { 2 3 /* (処理概要) 個票を作成 4 ・全体票_案件シートの個票作成(B列)にチェックありの場合に処理 ★未完★ 5 ・ひな形ファイルtempSSをコピーし、全体票ファイル_【作業要シート】セルC12のフォルダに格納 6 ・新設個票ファイルのファイル名を「個票_案件(氏名)」に変更する 7 ・新設個票ファイルに全体票の内容を転記する 8 ・全体票_案件シートのC列にタイムスタンプを追記する 9 ・処理完了のポップアップメッセージを表示する 10 */ 11 12 //個票ひな形ファイルのコピーを作成 13 14 //▼個票ひな形ファイルtempSSの指定 15 //URL https://docs.google.com/spreadsheets/d/~省略~/edit#gid=0 16 //~省略~ 17 //ひな形ファイル(FromSS)のIDは全体票SS_【作業用】シートのセルC6から取得 18 const AllSS = SpreadsheetApp.getActiveSpreadsheet(); 19 const AddrSheet = AllSS.getSheetByName('【作業用】'); 20 const tempId = AddrSheet.getRange(6, 3).getValue(); 21 console.log('tempId ' + tempId); 22 const tempSS = DriveApp.getFileById(tempId); 23 24 //▼新設個票ファイルの保存先フォルダToFの指定 25 //URL https://drive.google.com/drive/~省略~ 26 //1cdHckGcAAbUlF7elu6Z-BFCLDh38W6C4 27 //保存先フォルダToFのフォルダIDは全体票SS_【作業用】シートのセルC12から取得 28 const toFolId = AddrSheet.getRange(12, 3).getValue(); 29 console.log('toFolId ' + toFolId); 30 const toFol = DriveApp.getFolderById(toFolId); 31 32 //全体票_案件シートのH列データあり最終行lastRowの取得 33 const AllSheet = AllSS.getSheetByName('案件シート'); 34 const lastRow = AllSheet.getRange(AllSheet.getMaxRows(), 8).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); 35 console.log('lastRow ' + lastRow); //8が正解 36 const targetRows = lastRow - 6 37 console.log('targetRows ' + targetRows); //2が正解 38 39 //▼全体票_案件シートのB列~Y列の内容を二次元配列fromDetaとして取得 40 const fromDeta = AllSheet.getRange(7, 2, targetRows, 24).getValues(); 41 console.log('fromDeta ' + fromDeta); 42 43 for (let i = 0; i < targetRows; i++) { 44 let flag = fromDeta[i][0]; //作成フラグ 45 let case = fromDeta[i][6]; //案件 46 let No1 = fromDeta[i][7]; //項目1 47 let No2 = fromDeta[i][8]; //項目2 48 let No3 = fromDeta[i][9]; //項目3 49 let No5 = fromDeta[i][10]; //項目5 50 let No6 = fromDeta[i][11]; //項目6 51 let No7 = fromDeta[i][13]; //項目7 52 let No9 = fromDeta[i][15]; //項目9 53 let No10 = fromDeta[i][17]; //項目10 54 let No11 = fromDeta[i][19]; //項目11 55 let No12 = fromDeta[i][20]; //項目12 56 let No14 = fromDeta[i][22]; //項目14 57 let No15 = fromDeta[i][23]; //項目15 58 59 //個票作成フラグにチェックありの時だけ処理 60 //ブランクの時は処理スキップ 61 // if(条件){ 62 //      条件trueの時に行う処理 63 //     } 64 65 /*【条件①】//★うまくできない_ここから★ ***************************** 66 //個票作成フラグがALLブランクの時は、ポップアップMsgを表示して 67 //処理中止 68 69 //二次元配列fromDetaの各行から要素1のflagのみをspliceで抽出し、 70 //新しい配列flagArrを作成する 71 for (let i = 0; i < targetRows; i++) { 72 const flagArr = fromDeta[i].splice(0, 1); 73 console.log('targetRows ' + targetRows); 74 console.log('fromDeta[0] ' + fromDeta[0][0]); 75 console.log('fromDeta[1] ' + fromDeta[1][0]); 76 console.log('fromDeta[2] ' + fromDeta[2][0]); 77 console.log('flagArr ' + flagArr); 78 79 if (flagArr === false) { 80 Browser.msgBox("個票作成フラグが選択されていません。\\nどの案件の個票を作成するか、指定してください。\\n処理を中止します。"); 81 return; 82 } 83 } 84  ★ここまでうまくできない_ここまで★ **********************************/ 85 //【条件②】 86 //個票作成フラグにチェックありtrueの時 87 if (flag === true) { 88 89 //▼新設個票ファイルのファイル名SSName指定 90 //全体票SS_案件シートの案件(セルF7)_氏名(セルJ) 91 //★セル位置可変に変更要★ 92 const SSName1 = AllSheet.getRange(i + 7, 6).getValue(); 93 const SSName2 = AllSheet.getRange(i + 7, 10).getValue(); 94 const NewFileName = "個票_" + SSName1 + "(" + SSName2 + ")"; //新個票のファイル名 95 console.log('NewFileName ' + NewFileName); 96 97 //▼個票ひな形ファイルのコピーを作成 98 const newFile = tempSS.makeCopy(NewFileName, toFol); 99 100 //▼新設個票のファイルID、URLの取得 101 const newSSiD = newFile.getId(); 102 const newURL = newFile.getUrl(); 103 console.log('newSSiD ' + newSSiD); 104 console.log('newURL ' + newURL); 105 106 //▼新設個票のファイルID、URLを全体票_案件シートのD列とE列に転記 107 //★行位置可変に変更要★ 108 AllSheet.getRange(i + 7, 4).setValue(newSSiD); 109 AllSheet.getRange(i + 7, 5).setValue(newURL); 110 SpreadsheetApp.flush(); 111 112 //▼配列fromDetaとして取得した内容を新設個票IndvSS_経過シートに転記 113 const IndvSS = SpreadsheetApp.openById(newSSiD); 114 const IndvSheet = IndvSS.getSheetByName('経過シート'); 115 IndvSheet.getRange(2, 5, 1, 1).setValue(case);  //案件(セルE2)の転記 116 IndvSheet.getRange(4, 5, 1, 1).setValue(No2);  //項目2(セルE4)の転記 117 IndvSheet.getRange(5, 5, 1, 1).setValue(No5);   //項目5(セルE5)の転記 118 IndvSheet.getRange(6, 5, 1, 1).setValue(No3);   //項目3(セルE6)の転記 119 IndvSheet.getRange(7, 5, 1, 1).setValue(No4);   //項目4(セルE7)の転記 120 IndvSheet.getRange(10, 5, 1, 1).setValue(No6); //項目6(セルE10)の転記 121 IndvSheet.getRange(10, 6, 1, 1).setValue(No7); //項目7(セルF10)の転記 122 IndvSheet.getRange(11, 5, 1, 1).setValue(No9); //項目9(セルE11)の転記 123 IndvSheet.getRange(11, 6, 1, 1).setValue(No10); //項目10(セルF11)の転記 124 IndvSheet.getRange(12, 5, 1, 1).setValue(No11); //項目11(セルE12)の転記 125 IndvSheet.getRange(12, 6, 1, 1).setValue(No13); //項目13(セルF12)の転記 126 IndvSheet.getRange(13, 5, 1, 1).setValue(No14); //項目14(セルE13)の転記 127 IndvSheet.getRange(13, 6, 1, 1).setValue(No15); //項目15 (セルF13)の転記 128 129 //▼全体票_案件シートのC列にタイムスタンプ追記 130 const timeStamp = new Date(); 131 console.log("timeStamp " + timeStamp); 132 133 //getRange(●行目,列目,行分,列分) 134 //7 + ループ処理回数i 行目 135 AllSheet.getRange(i + 7, 3, 1, 1).setValue(timeStamp); 136 } 137 } 138 //▼処理完了Msgの表示 139 //処理が詰まらないように強制実行 140 SpreadsheetApp.flush(); 141 Browser.msgBox("全体票ファイル_【作業用】シート_セルC12で指定したフォルダ内に個票ファイルを作成しました。\\n個票ファイル上に情報を転記済です。\\n適宜、個票ファイルをご確認ください。"); 142} 143

補足情報

次回から類似のケースなら自分で解決できるようになりたいので
(残念ながら、なかなかそのレベルに到達できずにいますが、、、)
回答は急ぎませんので非エンジニアビギナーでも理解できるレベル
での解説、アドバイスをいただけると助かります。

お忙しいところお手を煩わせて申し訳ありません。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • 「チェックボックスに1つもチェックがない」というのは、言い方を変えると「trueが0こ」です。
    • 取得してきた2次元配列を.fliter()trueをもつものだけに絞り、
      • 絞った2次元配列の長さが0なら → 1つもチェックされていない。
      • 長さが1以上なら → 1つまたはそれ以上がチェックされている。という考え方です。
  • 質問者様のコードをじっくりとは見ていないのですが、どうやら、チェックが1つもなかった場合にしなくてもいい処理も最初に全部しているような気がします。
    • しなくてもいい処理は、チェックボックスの判定した後にするようにしましょう。
  • 1つの関数のなかにたくさんの処理をかくことは、コードの可読性の観点からあまりよくありません。
    • 長すぎる場合&汎用性のある処理は、なるべく別関数にしましょう。

コード例

イメージ説明

javascript

1function createIndvSS() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheet = ss.getActiveSheet(); 4 const lastRow = sheet.getLastRow(); 5 6 // 1つでもチェックされているかどうかの判定 7 const flag = isChecked(sheet, 2, lastRow, 1); // 例 true 8 9 // flagがfalseなら(1つもチェックされていなかったら) 10 if (!flag) { 11 // 「処理中断のお知らせ」のメッセージボックスが表示されて、 12 13 // 処理を中断する(関数をここで終了。以降の行は実行されない) 14 return; 15 } 16 17 // ここ以降に、チェックされた行がある場合の処理を書く 18} 19 20/** 21 * スプレッドシートからチェックボックスの値を全て取得し、その2次元配列の中にtrueが含まれるか判定する関数 22 * @param {object} sheet チェックボックスのあるシート 23 * @param {number} startRow 開始行番号 24 * @param {number} lastRow 最終行番号 25 * @param {number} col チェックボックスのある列番号 26 * @return {boolean} trueが1つでもあれば、true。なければfalse 27 */ 28function isChecked(sheet, startRow, lastRow, col) { 29 const allValues = sheet.getRange(startRow, col, lastRow-startRow+1).getValues(); 30 // 例 [ [ true ], [ false ], [ true ], [ false ], [ false ] ] 31 32 const trueValues = allValues.filter(arr => arr[0]); 33 // 例 [ [ true ], [ true ] ] 34 35 return trueValues.length > 0; // 例 true 36}

ご質問への回答

①isCheckedの後ろの(sheet, startRow, lastRow, col)は、isChecked関数に渡す値(引数)かと。引数指定の要否、何を引数として指定するかはどのように判断すればよいのですか?

isChecked()関数に限らず、関数を作成する際は汎用性を持たせる(他でも使い回しやすい)ようにしています。
ですので何を引数として指定するのかはコードの作成者の好みです。
(なので、質問者様の使いやすいように引数などアレンジしていただいて大丈夫です)
使いまわさないのであれば引数は不要です。


②filter()は、配列の要素1つずつに対して、条件に合致するか見ていき、合致したもの  だけを集めて、新たな配列trueValuesを作る、であっていますか?

あっています💮

すべてfalseの時、  trueを混ぜた時ともに  console.log(trueValues )、console.log(trueValues.length)、で確認できませんでした。

私のエディタでは問題なくconsole.log(trueValues)console.log(trueValues.length)も確認できているので、質問者様の方でできない理由は不明です。
正しく理解はできていますが、試したコードかスプレッドシート側かもしくは確認方法が間違っている可能性があります。
もしよかったら詳細を教えてくださいませ。


③filter(arr => arr[0])の部分がよくわかりません。arr => arr[0]は、arr[0]は配列の要素0のことで、arrにarr[0]の値を代入すると  いうことを指示している??

違います。
質問者様はアロー関数について理解する必要があります。

アロー関数について

ES6から登場した新しい関数の記法です。
従来のfunctionキーワードによる関数より簡略した書き方をすることができます。
他に機能的な違いもありますが今回は関係ないので説明を割愛します。

javascript

1// 従来の関数 2function oldFunc(number) { 3 return number * 10; 4} 5console.log( oldFunc(5) ); // 50 6 7// アロー関数 8const newFunc = (number) => { 9 return number * 10; 10} 11console.log( newFunc(6) ); // 60
  • アロー関数は引数が1つだけの場合()を省略可能です。
  • 処理が1行だけの場合、returnを省略可能です。

よって、より簡潔に↑のアロー関数を書くと以下のようになります。

javascript

1const newFunc = number => number * 10;

してがって、こういうことです。

javascript

1// アロー関数 2const trueValues = allValues.filter(arr => arr[0]); 3 4// 従来の書き方 5var trueValues = allValues.filter( function(arr) { 6 return arr[0]; 7} );
  • allValuesは、2次元配列。
  • 引数のarrは、その各要素(1次元配列)を表現。
  • arr[0]は、各要素(1次元配列)の0番目の要素を指定して、(省略しているけど)returnで値を戻しており、その値はtrue or falseです。
.filter()について

javascript

1配列.filter(コールバック関数)
  • .filter()は、コールバック関数からreturn戻された条件に合致する要素のみに絞り、新しい配列を生成するメソッドです。
  • 「条件」なのでtruefalseをreturnする(戻す)ことになります。
  • 今回の場合「arr[0]の値がtrueだった場合true、そうじゃない場合はfalse」を戻すわけですから、
    • 丁寧に書くとreturn arr[0] === trueが条件式になるわけです。
    • でもarr[0]の値は元からbooleanなので、そんなことしなくてもその値そのものをreturnするだけですみます。

投稿2022/11/26 07:59

編集2022/11/26 18:25
Cocode

総合スコア2314

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

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

donguriko

2022/11/26 13:35

Cocodeさま お忙しい中回答ありがとうございます。 すみません、当方の知識が乏しく何点かわからない点があるので教えてください。 特に functionの後ろに(引数)がある関数と filter()の使い方について理解が 追い付かず消化不良気味です。。。 配列の時も苦戦しましたが、大きな壁にぶつかっている感じです。 以下、とんちんかんな質問でしたら申し訳ありません。 ①isCheckedの後ろの(sheet, startRow, lastRow, col)は、  isChecked関数に渡す値(引数)かと。  引数指定の要否、何を引数として指定するかはどのように判断すればよいのですか? ②filter()は、配列の要素1つずつに対して、条件に合致するか見ていき、合致したもの  だけを集めて、新たな配列trueValuesを作る、であっていますか?  記載いただいたコードを自分で写経し、チェックボックスのチェックを入れたり  外したりして、trueValuesがどう変わるのかを見ようとconsole.logでの確認を試みました。  配列trueValuesには、filter()で指定した条件に合致した要素だけが集められる筈なので、  条件でtrueのものだけ集めるとすれば2つチェックを入れると例で記載いだいた  [ [ true ], [ true ] ]が確認できると想像していたのですが、すべてfalseの時、  trueを混ぜた時ともに  console.log(trueValues )、console.log(trueValues.length)、で確認できませんでした。  console.log(flag)では、true/falseが確認できました。  配列が作られるなら確認できるのでは?? と思ったのですが、正しく理解できていないですか?  それとも、確認方法が正しくないですか? ③filter(arr => arr[0])の部分がよくわかりません。  arr => arr[0]は、arr[0]は配列の要素0のことで、arrにarr[0]の値を代入すると  いうことを指示している?? arrはconst や let 等で宣言なく突然出てきたように思うのですが、arrが何を  さしているのかは、どこから読み解けばいいですか?? 以前、別件の配列から空白値を除外する照会で、詳細な解説をいただいたのですが、  やはり理解が追い付かず消化しきれていません。   お忙しいところ申し訳ありませんが、回答は急ぎませんので補足説明をいただけないでしょうか?  
Cocode

2022/11/26 16:45

回答を更新しました!
Cocode

2022/11/26 16:52 編集

「別関数にしましょう」とわざわざisChecked()をつくりましたが、理解しにくかったり無駄だと感じたら、別関数にせず、元々の関数の中に直接処理を書いてしまっても大丈夫です。 私が質問者様のコードを全部ちゃんとみていないので、ニーズに合っていない可能性もあります。(ごめんなさい)
donguriko

2022/11/27 08:24

Cocodeさま 夜遅くまで手を取らせてしまい申し訳ありません。 かみ砕いた解かりやすい解説ありがとうございます。 ビギナーでもなんとかついていけます。 ▼さら問い① 関数を分けた方がいい件 当方、スプレッドシートの図形に関数を割り当てて、図形クリックしたらGAS走る、 という使い方をしていることが多いのですが、 もし仮にやりたい処理が、 function myFunction1() { } function myFunction2() { } function myFunction3() { } というように3つの関数で1つの処理完了、というコードの書き方をした場合、 1つの図形に複数の関数を割り当てることも可能ですか? ちなみに、コードの書き方は上記のように列記していく方法でOK? 今まで、関数を分けるという発想がなく、(使いまわすという発想もなかったです) 1つの関数内に全部盛り込んでいました。 勉強になりました。教えていただき感謝です!! ▼さら問② 関数の流用手順 もし、function isChecked()を別のスプレッドシートで流用したい場合は、 function isChecked(){ } の部分を新しいGASコードのところにコピペする、という方法ですか? ▼console.log(trueValues )、console.log(trueValues.length)が表示されない件 理屈は全然わかりませんがどうやらconsole.logを記載する位置がダメだったようです。 記載位置を変えたら、想定通りに表示されました。 <NG> const trueValues = allValues.filter(arr => arr[0]); //条件合致を抽出し、新配列trueValuesを作成 return trueValues.length > 0 //(条件)新配列trueValuesの長さが0より大きい時をtrueとする console.log('trueValues ' + trueValues);     //画面上コードが半透明の薄い表示 console.log('trueValues[0] ' + trueValues[0]);  //画面上コードが半透明の薄い表示 <OK> const trueValues = allValues.filter(arr => arr[0]); //条件合致を抽出し、新配列trueValuesを作成 console.log('trueValues ' + trueValues); console.log('trueValues[0] ' + trueValues[0]); //いつもの表示。returnの前に書かないとダメなのか? return trueValues.length > 0 いただいた例のサンプルの内容を色々変えたりしながら、色々な条件で filter()とコールバック関数、トライしてみました。 アロー関数はまだ自信がないですが、filter()とコールバック関数は 少しイメージがつかめた気がします。 もう少し、簡単な例で手を動かして、まずはfilter()とコールバック関数の 感覚をつかみたいと思います。 感覚がつかめたら、次はアロー関数もトライしたいと思います。 まずは簡単な例でイメージをつかむ方法、とても勉強になりました。 これから実践したいと思います。ありがとうございました。
Cocode

2022/11/27 11:22

▼さら問い① 関数を分けた方がいい件 図形には1つのスクリプトしか割り当てられませんので、関数をわけた場合、1つの関数にまとめておく必要があります。 function mainProcess() { myFunction1(); myFunction2(); myFunction3(); } function myFunction1() {} function myFunction2() {} function myFunction3() {} そしてmainProcess()関数を図形に割り当てます。
Cocode

2022/11/27 11:33 編集

▼さら問② 関数の流用手順 それも可能ですが私が意図した流用はそういう意味ではありません。 例えば、質問者様のGASを例にとると、 図形のボタンをクリックしたら、「全体票のチェックボックスにチェックのある行のみ、個別票シートを作成し内容を転記する」 という機能ですよね。 ではさらにボタンをもう一つ追加して、 図形のボタンをクリックしたら、「全体票のチェックボックスにチェックのある行のみ、その行を削除する」 という機能もつけたいとします。 『全体票のチェックボックスにチェックのある行のみ、』←この部分、共通だと思いません? なので別関数に分けておいたやつを使っちゃおうという考えです。 そうすると、同じことを何回もかかなくてすみます。 こういうイメージ function createIndividualSheet() { // これを「個別票作成ボタン」に割り当てる // チェックされた行の値のみに絞る処理 const checkedValeus = getCheckedRows(); // 個別票を作成する処理 } function deleteCheckedRows() { // これを「削除ボタン」に割り当てる // チェックされた行の値のみに絞る処理 const checkedValeus = getCheckedRows(); // 行を削除する処理 } function getCheckedRows() { // チェックされた行の値のみをreturnで戻す }
donguriko

2022/11/27 13:10

Cocodeさま さら問の回答ありがとうございます。 ▼さら問い① 関数を分けた方がいい件 function mainProcess() { myFunction1();  myFunction2(); myFunction3(); } function myFunction1() {コード詳細はこっちに書く} function myFunction2() {} function myFunction3() {} と、いうことですね。 ありがとうございます。勉強になりました。 ▼さら問② 関数の流用手順 イメージできました。 確かに同じことを何回もかかなくてすみますね。 具体例を挙げてくださり、とても分かりやすかったです。 お忙しい中、丁寧なレクチャー本当にありがとうございました!! 教えていただいたことを自分のモノにできるよう頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問