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

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

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

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

Q&A

解決済

2回答

310閲覧

GAS 処理時間が長い

aneig

総合スコア6

Google スプレッドシート

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

0グッド

0クリップ

投稿2024/11/25 03:58

実現したいこと

イメージ説明
イメージ説明

ダンボールシートの10更新ボタンを押したら、No.10の範囲(B:F)の9行目から下の値(B9:F25)を、送信履歴シートのD:Hに貼り付けたい
・”9行目から下の値(B9:F25)”は、その時によって行の増減があります
・D列の製品名は空白の場合もあります
・ダンボールシートには10だけでなく右隣の37のように同じ表が連なっています

まだGASは組めていないが、送信履歴シートの
Aに送信(ボタンを押した)日付
BにダンボールシートA1の値(今回はダンボール)
CにダンボールシートのNoの値(今回は10)
も送信できるようにしたい

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

・処理に5分もかかってしまう

該当のソースコード

function getCurrentRegion() { // アクティブなシートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var jo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ダンボール'); var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('送信履歴'); var purasu1 = sheet1.getLastRow() + 1; //すでにセル内にあるデータを上書きしないように1を足す console.time("Inefficient Loop3"); // 基準セルを指定 (ここではA1セル) var startingCell = jo.getRange("b9"); //b9が基準 //B9 var startRow = startingCell.getRow();//行 var startColumn = startingCell.getColumn();//列 console.timeEnd("Inefficient Loop3"); console.time("Inefficient Loop"); // 現在のシートのデータ範囲を取得 var data = jo.getDataRange().getValues();//ダンボールのセル範囲の値(values)を取得 console.timeEnd("Inefficient Loop"); console.time("Inefficient Loop6"); // 空白セルにぶつかるまで行を拡張する var lastRow = startRow;//行 console.timeEnd("Inefficient Loop6"); console.time("Inefficient Loop5"); while (lastRow <= sheet1.getLastRow() && data[lastRow - 1][startColumn - 1] !== "") { lastRow++;}//b9の行と送信履歴の最後の行大きさ判断、データ範囲の最終行の一個したみて空白確認繰り返す console.timeEnd("Inefficient Loop5"); console.time("Inefficient Loop2"); //列は固定 var lastColumn = startColumn+5;//b9から+5列のところ console.timeEnd("Inefficient Loop2"); console.time("Inefficient Loop8"); var currentRegion = jo.getRange(startRow, startColumn, lastRow - startRow, lastColumn - startColumn).getValues(); //上の値をもらう console.timeEnd("Inefficient Loop8"); console.time("Inefficient Loop9"); var lastRow2 = sheet1.getLastRow();//送信履歴の最初から最後の行 console.timeEnd("Inefficient Loop9"); console.time("Inefficient Loop3"); sheet1.getRange(lastRow2+1, 4, currentRegion.length, currentRegion[0].length).setValues(currentRegion);//送信履歴の最終行にあげる console.timeEnd("Inefficient Loop3"); // 結果をログに表示 Logger.log(currentRegion); }

試したこと・調べたこと

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

動作は正常ですが、処理時間は変わらなかった

補足

特になし

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

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

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

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

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

int32_t

2024/11/25 08:04

console.time*() で調査した形跡がありますが、どこが遅かったですか?
aneig

2024/11/25 23:42

Loop : 35452ms Loop5: 204701ms Loop9: 11252ms 上記でかなり時間がかかってしまっています その他は1桁です
guest

回答2

0

ベストアンサー

例えば、次のようなコードをお試しいただき
希望の動作と異なるようならコメントください

JavaScript

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

投稿2024/11/30 03:08

YellowGreen

総合スコア841

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

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

aneig

2024/11/30 04:21

希望の動作でとてもとても早く動きました、、、大変勉強になります ありがとうございました泣
guest

0

js

1 while (lastRow <= sheet1.getLastRow() && data[lastRow - 1][startColumn - 1] !== "") { 2 lastRow++;}

上記コードを、下記のように変更すると処理時間が改善するかもしれません。

js

1 const sheetLastRow = sheet1.getLastRow(); 2 while (lastRow <= sheetLastRow && data[lastRow - 1][startColumn - 1] !== "") { 3 lastRow++; 4 }

シートへの読み書きは遅いので、可能なら避けるかまとめましょう。
他の部分を改善するのは難しそうです。

投稿2024/11/25 23:52

int32_t

総合スコア21775

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

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

aneig

2024/11/26 00:14

少しはやくなりました! 読み書き以外の方法も考えてみます、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問