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

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

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

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

Q&A

解決済

1回答

234閲覧

2つのGASを1つにまとめたい

aneig

総合スコア6

Google スプレッドシート

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

0グッド

0クリップ

投稿2024/12/02 00:49

実現したいこと

2つのGASを組み合わせたい
1つ目のコピペ作業が完了したら、2つ目で値をクリアにしたい

1つ目
https://teratail.com/questions/00pywgdd75r13y
上記の作業

2つ目
イメージ説明
繰越残更新用シートのI,K,M,O,Q,AC列に”8”があればそのセルをクリアしたい
・”8”は完全一致のみ反応したい
・繰越残更新用シートはこれからどんどん下に増えていく
・I,K,M,O,Q,AC列はINDIRECT関数で別シートから表示されている

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

2つのGASの組み合わせ方がわからないです

該当のソースコード

1つ目

1function get1() { 2 // 履歴データの基準となるセル 3 const startCellName = 'B9'; 4 5 // 品名(ダンボール)のセル 6 const itemCellName = 'A4'; 7 8 // 品名Noの行 9 const itemNumberRow = 4; 10 11 // 履歴データの列数 12 const numColumns = 5; 13 14 // 送信履歴データの記入開始列 15 const logStartColumn = 4; 16 17 // それぞれのシートを取得 18 const itemSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ダンボール'); 19 const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('送信履歴'); 20 21 // ダンボールシートの基準セルの行番号と列番号とダンボールNo 22 const startCell = itemSheet.getRange(startCellName); 23 const itemStartRow = startCell.getRow(); //行 24 const itemStartColumn = startCell.getColumn();//列 25 26 // 履歴見出しを作成 27 const date = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd'); 28 const item = itemSheet.getRange(itemCellName).getValue(); 29 const itemNumber = startCell.offset(itemNumberRow - itemStartRow, 0).getValue(); 30 const titles = [date, item, itemNumber]; 31 32 // ダンボールシートの基準セルからデータが連続する最下行までの行数 33 const itemLastRow = startCell.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 34 const numRows = itemLastRow - itemStartRow + 1; 35 36 // 送信履歴シートの最終行 37 const logLastRow = logSheet.getLastRow(); 38 39 // 履歴データを取得 40 const values = itemSheet 41 .getRange(itemStartRow, itemStartColumn, numRows, numColumns) 42 .getValues(); 43 44 // 履歴見出しを記入 45 logSheet 46 .getRange(logLastRow + 1, 1, 1, titles.length) 47 .setValues([titles]); 48 49 // 履歴データを記入 50 logSheet 51 .getRange(logLastRow + 1, logStartColumn, values.length, values[0].length) 52 .setValues(values); 53 54 // 結果をログに表示 55 Logger.log(values); 56} 57 58

2つ目

1function RIREKI8() { 2 // 初期設定 3 var rowData = 3; // データの開始行 4 var columnH = 8; // 複数の列の開始列(H列) 5 var columnP = 17; // 複数の列の終了列(Q列) 6 var columnAR =29; // 単独の列(AC列) 7 var clearValue = '8'; // クリア対象の値 8 9 var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 10 var sheet = spreadSheet.getSheetByName('繰越残更新用'); 11 var values = sheet.getDataRange().getValues(); 12 13 // 行、列の値を確認しながら該当するセルをクリア 14 // ※ 配列valuesの要素は行(row)、列(col)ともシートの行番号、列番号より 1 小さい 15 for (var row = rowData - 1; row < values.length; row++ ) { 16 // 複数の列の範囲の処理 17 for (var col = columnH - 1; col <= columnP - 1; col++) { 18 if (values[row][col] == clearValue) { 19 sheet.getRange(row + 1, col + 1).setValue(''); 20 } 21 } 22 // 単独の列の範囲の処理 23 if (values[row][columnAR - 1] == clearValue) { 24 sheet.getRange(row + 1, columnAR).setValue(''); 25 } 26 } 27} 28

試したこと・調べたこと

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

初心者すぎてどこをどう変更したらいいのかわからなかった

補足

特になし

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

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

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

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

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

YellowGreen

2024/12/02 03:24

2つ目の関数がご希望どおりの動作をしているのであれば、 新たに // ほかの関数を実行する関数 function exec01() { // 最初に実行したい関数 get1(); // 次に実行したい関数 RIREKI8(); } のような関数をつくって この関数(exec01)を実行すれば、 2つの関数が記載された順に実行されます
aneig

2024/12/02 04:07

できました泣 また教えていただいてありがとうございます RIREKI8の処理時間が8498msなのですが、これ以上時間短縮するのは難しいですかね、、?
guest

回答1

0

ベストアンサー

早くなっているかどうかわかりませんがお試しください

JavaScript

1function rireki8() { 2 // 初期設定 3console.time('データの取得'); 4 const rowData = 3; // データの開始行 5 const colStart = 8; // 複数の列の開始列(H列) 6 const colEnd = 17; // 複数の列の終了列(Q列) 7 const colAdd = 29; // 単独の列(AC列) 8 const clearValue = '8'; // クリア対象の値 9 const colNames = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 10 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q']; 11 const colNameAdd = 'AC'; 12 13 const ss = SpreadsheetApp.getActiveSpreadsheet(); 14 const sheet = ss.getSheetByName('繰越残更新用'); 15 // const values = sheet.getDataRange().getValues(); 16 const lastRow = sheet.getLastRow(); 17 const lastCol = sheet.getLastColumn(); 18 const values = sheet.getRange(1, 1, lastRow, lastCol).getValues(); 19console.timeEnd('データの取得'); 20 21 // 指定の列の中で値が8となっているセルを全て空白にする 22 // ※ 配列valuesの要素は行(row)、列(col)ともシートの行番号、列番号より 1 小さい 23console.time('データの消去'); 24 const rangeNames = []; 25 for (let row = rowData - 1; row < values.length; row++) { 26 // 複数の列の範囲の処理 27 for (let col = colStart - 1; col <= colEnd - 1; col++) { 28 if (values[row][col] == clearValue) { 29 rangeNames.push(colNames[col] + (row + 1)) 30 } 31 } 32 // 単独の列の範囲の処理 33 if (values[row][colAdd - 1] == clearValue) { 34 rangeNames.push(colNameAdd + (row + 1)) 35 } 36 } 37 const rangeList = sheet.getRangeList(rangeNames); 38 rangeList.setValue(''); 39console.timeEnd('データの消去'); 40}

投稿2024/12/03 09:03

編集2024/12/05 09:43
YellowGreen

総合スコア841

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

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

aneig

2024/12/03 23:49

400msくらいはやくなりました!!ありがとうございます、、泣
YellowGreen

2024/12/05 09:50

どの部分の処理に時間を要しているのかを 表示できるようにしました 加えて、 getDataRangeをgetRangeに変えてみてもあります 10,000行程度のテストデータで試した結果です ---------- 18:47:05 お知らせ 実行開始 18:47:10 デバッグ データの取得: 5024ms 18:47:11 デバッグ データの消去: 1236ms 18:47:12 お知らせ 実行完了
aneig

2024/12/06 01:49

はやくなりました!! 最後まで教えていただき本当にありがとうございました。 勉強になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問