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

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

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

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

Q&A

解決済

1回答

294閲覧

コピペしなくても省略して変更できるようにしたい

aneig

総合スコア6

Google スプレッドシート

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

0グッド

0クリップ

投稿2024/12/16 00:42

実現したいこと

イメージ説明
イメージ説明
イメージ説明
在庫表の5行目の番号ごとに3つのGASをコピペして //変更 部分を変更しているが(全部で8箇所)、在庫している種類が沢山ある為1つずつ変更するのが大変
番号ごとにコピペしなくても省略して変更できるようにしたい

詳細
画像1枚目から在庫表、繰越残更新用、送信履歴
在庫表の更新ボタンで3つのGASを実行している
在庫表は同じ列数(5列ずつ)で右に沢山連なっている

発生している問題・分からないこと

番号ごとにコピペしなくても省略して変更できるようにする方法がわからない
(このようなことが可能かどうかも分からない)

該当のソースコード

function kopi8() {//変更3 const gyo = 11; // 履歴データの基準となるセル const startCellName = ("B" + gyo);//変更4 // 品名(ダンボール)のセル const itemCellName = 'A5'; // 品名Noの行 const itemNumberRow = 5; // 履歴データの列数 const numColumns = 5; // 送信履歴データの記入開始列 const logStartColumn = 4; // それぞれのシートを取得 const itemSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ダンボール'); const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('送信履歴'); // ダンボールシートの基準セルの行番号と列番号とダンボールNo const startCell = itemSheet.getRange(startCellName); const itemStartRow = startCell.getRow(); //行 const itemStartColumn = startCell.getColumn();//列 // 履歴見出しを作成 const date = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd'); const item = itemSheet.getRange(itemCellName).getValue(); const itemNumber = startCell.offset(itemNumberRow - itemStartRow, 0).getValue(); const titles = [date, item, itemNumber]; // ダンボールシートの基準セルからデータが連続する最下行までの行数 const itemLastRow = startCell.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); const numRows = itemLastRow - itemStartRow + 1; // 送信履歴シートの最終行 const logLastRow = logSheet.getLastRow(); // 履歴データを取得 const values = itemSheet .getRange(itemStartRow, itemStartColumn, numRows, numColumns) .getValues(); // 履歴見出しを記入 logSheet .getRange(logLastRow + 1, 1, 1, titles.length) .setValues([titles]); // 履歴データを記入 logSheet .getRange(logLastRow + 1, logStartColumn, values.length, values[0].length) .setValues(values); // 結果をログに表示 Logger.log(values); }
function rireki8() {//変更1 const ss = SpreadsheetApp.openById("別のファイルのリンク"); const sheet = ss.getSheetByName('繰越残更新用'); // 初期設定 const rowData = 3; // データの開始行 const colStart = 8; // 複数の列の開始列(H列) const colEnd = 17; // 複数の列の終了列(Q列) const colAdd = 29; // 単独の列(AC列) const clearValue = '8'; // 変更2,クリア対象の値 const colNames = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q']; const colNameAdd = 'AC'; // const values = sheet.getDataRange().getValues(); const lastRow = sheet.getLastRow(); const lastCol = sheet.getLastColumn(); const values = sheet.getRange(1, 1, lastRow, lastCol).getValues(); // 指定の列の中で値が8となっているセルを全て空白にする // ※ 配列valuesの要素は行(row)、列(col)ともシートの行番号、列番号より 1 小さい const rangeNames = []; for (let row = rowData - 1; row < values.length; row++) { // 複数の列の範囲の処理 for (let col = colStart - 1; col <= colEnd - 1; col++) { if (values[row][col] == clearValue) { rangeNames.push(colNames[col] + (row + 1)) } } // 単独の列の範囲の処理 if (values[row][colAdd - 1] == clearValue) { rangeNames.push(colNameAdd + (row + 1)) } } const rangeList = sheet.getRangeList(rangeNames); rangeList.setValue(''); }

2つを合わせて実行

1function exec8() {//変更5 2 3 var no = 'No.'; 4var bango = 8;//変更6 5 var bango1 = '更新します!'; 6 7 //メッセージボックスの表示形式 8 var res = Browser.msgBox(no+bango,bango1,Browser.Buttons.OK_CANCEL); 9 10 //OKボタンが押された際の動作 11 if(res == "ok"){ 12 13kopi8();//変更7 14rireki8();//変更8 15 16 //Cancelボタンが押された際の動作 17 }else if(res == "cancel"){ 18 var kyan = "キャンセルしました" 19 Browser.msgBox(kyan,Browser.Buttons.OK); 20} 21} 22

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

どこを変更したらいいかわからなかった

補足

特になし

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

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

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

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

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

guest

回答1

0

ベストアンサー

前回の回答でも説明があったように、
ボタン(番号)ごとに名前の違う1行の関数を必要な数だけ用意しておき
それぞれに番号を引数としてexecNum関数を呼び出すようにします

呼び出されたexecNum関数は実行の可否の確認後に
kopiNumとrirekiNum二つの関数を実行しますが、
このときも番号を引数として渡すので今後は書き換える必要がなくなります

番号ごとの開始列の名前(変更4の部分)は
kopiNum関数の冒頭で、番号と列名との対応関係を全て定義しておきます

なので、
exec8, exec27...などの関数をすべての番号分作成するのと
COLS{
...
}
の中に番号と列名との対応を全て記入するのが手間ですが
その後は、ボタンに割り当てられた関数からexecNum関数を実行すると
引数(...)内の番号で処理が実行されることになると思います

動作確認までは行っていないので
不具合等ありましたらエラーコードを全てコピペして
ご返信ください

変更箇所は以下のとおりです

JavaScript

1// 変更の前提(ボタンに割り当てられた関数名に合わせて作成) 2function exec8() { execNum(8) } 3function exec27() { execNum(27) } 4// 以下同様にボタンに割り当てられた関数を作成 5// function exec...() { execNum(...) } 6 7function rirekiNum(num) { //変更1 8 9 const clearValue = num; // 変更2,クリア対象の値 10 11function kopiNum(num) { //変更3 12 // 変更3の次の行に追加 13 // 番号に対応する開始列名を列挙 14 const COLS = { 15 8: 'B', 16 27: 'G', 17 // 以下同様に番号とコロンと最初の列の名前とカンマを追加 18 // 番号: '列名', 19 }; 20 21 const startCellName = (COLS[num] + gyo); //変更4 22 23function execNum(num) { //変更5 24 25 const bango = num; //変更6 26 27 kopiNum(num); //変更7 28 29 rirekiNum(num); //変更8

投稿2024/12/16 08:02

編集2024/12/16 08:11
YellowGreen

総合スコア841

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

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

YellowGreen

2024/12/16 08:06

8番や27番の[更新]ボタンには、 exec8やexec27などの関数名が既に割り当てられているという前提で回答しています
aneig

2024/12/17 03:52

できました泣 こういう風に活用したらよかったんですね、、! とても勉強になりました、ありがとうございました
aneig

2024/12/17 06:47

すみません、今他のものもすべて追加したらエラーでException: Range not foundとでてしまいました、、、 見てもらいたいのですが、修正したコードが文字数オーバーで貼れなくて、泣 編集前のコードを消して貼っても大丈夫でしょうか?
YellowGreen

2024/12/17 06:55 編集

おそらく、文字数オーバーの原因は、 1行の関数の部分か 番号と列名の列挙の部分だと思われます セル範囲が見つからないというエラーなら 1行の関数に指定している番号の確認と 列挙している列名の指定が合っているかの再確認を することになると思うので コードをアップしていただいても当方では確認できないと思われます それでも、不一致部分が見つからないときは、 エディタからエラーが出る番号の[更新]に割り当てた1行の関数を実行してみて エラーに表示される行番号のスクリプトがどの部分なのかを確認して その部分を教えてください
aneig

2024/12/17 07:21 編集

詳細に書き忘れてしまったのですが、在庫表シートは種類でシートがわけられていて(表の形式、やることは同じ)、GASも種類ごとにファイル?を分けています ダンボールシートのexec8を実行したら、3か所のエラーが出ました このエラーはexec8以外を/**/で実行しないようにしたら、正常に実行されました Exception: Range not found kopiNum @ 【その他】.gs:77 function kopiNum(num) { // その他シートの基準セルの行番号と列番号とその他No const startCell = itemSheet.getRange(startCellName); execNum @ 【その他】.gs:126 function execNum(num) { kopiNum(num); exec8 @ 【ダンボール】.gs:2 function exec8() { execNum(8) } すみません、伝わりますでしょうか、、
YellowGreen

2024/12/17 08:23

【段ボール】.gsと【その他】.gs とに同じ名前の execNum() や kopiNum() や rirekiNum() がそれぞれにあるのでしょうか? .gsが異なっても名前が同じなら競合しますから execDanNum kopiDanNUM rirekiDanNum execEtcNum kopiEtcNUm rirekiEtcNum などと関数名が重複しないようにする必要があります
YellowGreen

2024/12/17 08:29

exec8( ) exec27() も複数あるならこちらも名前を変えて [更新]ボタンの割り当て直しをする必要があります
YellowGreen

2024/12/17 23:25 編集

そうでない(関数名の重複がない)としたら 変更箇所にシート名はなかったのですが シートの違いはどのようにしていましたか?
aneig

2024/12/17 23:52

execNum() kopiNum() rirekiNum() がそれぞれにある状態だったので、関数名を変更したら実行できました!!ありがとうございます、、泣 ちなみにシート名の変更は記載し忘れてしまっていましたが、kopi8の // それぞれのシートを取得 const itemSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ダンボール'); のダンボール部分をシートごとに変更していました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問