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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1756閲覧

GASで「最終行に対して、列の中での最大値を割り当てる方法」を知りたいです

umino

総合スコア54

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/09/10 06:15

GASで、最終行に対して、列の中での最大値を割り当てる方法について、
すみませんがGASにお詳しい方、ご教示いただけませんでしょうか。

前提

・B列に、001-nnnnnの番号を手動で付与しています。(001は固定、n部分は変動です)
・付与した後にとあるルールで並べ替えを行うので、最終行が一番大きい値とは限りません。
・googleフォームからデータ送信し、スプレッドシート側では最終行(送信されたデータ)に対して色々なfunctionを実行しています。

実現したいこと

・最終行に対して「B列内の001-nnnnnの中で最大の値を検索し、+1したものを付与」したいです。

下記例でいうと、列中で最大値は「001-00119」なので、GASで付与したいのは最大値+1の「001-00120」です。

例:
1 管理番号
2 001-00001
3 001-00105
4 001-00103
5 001-00119 ←最大値
6 001-00002
7 001-00097
8 001-00120 ←最終行。これをGASで自動割り当てしたい
---一番下に1000行 [追加]------------

この場合、GASにはどのように書けば動作しますでしょうか。

試したこと

下記まで考えたのですが、行き詰ってしまいました。

GAS

1function myFunction() { 2 var Sheet = SpreadsheetApp.getActiveSheet(); 3 var LastRow = Sheet.getLastRow(); 4 // LastRowに対して、2行目から最大値を抽出する? 5 for (var Row = 2; Row <= LastRow; Row++) { 6 } 7}

申し訳ないのですが、お詳しい方、ご教示いただけませんでしょうか。

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

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

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

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

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

sawa

2021/09/10 13:32

コード記述の前に、どういうプロセスを踏めばやりたいことが実現できるかを考えてみましょう。 001-nnnnn という番号は文字列ですが、なにをもって最大値としていますか? 数値ではないので、シート関数のMAXやjsのMath.max()はそのまま使えません。 (考え方・手順という意味で) ・最大値に該当するものをどうしたら取得できるか? ・同じく文字列なので +1 した番号をどうすれば作成できるか? この辺りをまずは考えてみると、コード作成の方向性が見えてくると思います。
guest

回答1

0

ベストアンサー

・最終行に対して「B列内の001-nnnnnの中で最大の値を検索し、
+1したものを付与」したいです。

例を載せておきます。解析はご自身でお願いしますね。

GAS

1function myFunction() { 2 let sheet = SpreadsheetApp.getActiveSheet(); 3 const B = 2; 4 const last_row = sheet.getRange(sheet.getMaxRows(), B) 5 .getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); 6 if (last_row < 2) { 7 sheet.getRange(2, B).setValue('001-00001'); 8 return ; 9 } 10 // 念のため、B列に「001-nnnnn」以外のデータが紛れているケースを考慮 11 const word = '=query(B:B, "select max(B) ' 12 + "where B matches '^001-\d{5}$' " //紛れがない場合はこの行を削除 13 + "label max(B) ''" + '", 1)'; 14 15 // 出力行の右隣(C列)を計算用セルとして一時利用します。 16 with (sheet.getRange(last_row + 1, B + 1)) { 17 setValue(word); 18 const ret = '001-' 19 + (+(getValue().toString().split('-')[1]) + 1) 20 .toString().padStart(5, '0'); 21 clearContent(); 22 sheet.getRange(last_row + 1, B).setValue(ret); 23 } 24}

GAS

1function sortVersion() { 2 let sheet = SpreadsheetApp.getActiveSheet(); 3 const B = 2; 4 const last_row = sheet.getRange(sheet.getMaxRows(), B) 5 .getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); 6 if (last_row < 2) { 7 sheet.getRange(2, B).setValue('001-00001'); 8 return ; 9 } 10 const v = sheet.getRange(2, B, last_row - 1, 1) 11 .getValues() 12 .filter(s => ~s[0].toString().search(/^001-\d{5}$/)) 13 .sort((x, y) => y[0].localeCompare(x[0]))[0]; 14 const ret = '001-' 15 + (+[...v].toString().replace(/^001-/, '') + 1).toString().padStart(5, '0'); 16 sheet.getRange(last_row + 1, B).setValue(ret); 17}

投稿2021/09/10 13:56

編集2021/09/11 04:04
mayu-

総合スコア335

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

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

umino

2021/09/13 05:30

mayu-さん さっそくのご回答ありがとうござます。 返信が遅くなりすみません。 ご提示いただいたsortVersionを実行したところ、期待した結果が得られました。 localeCompare、padStartなど使ったことのない関数もあり、大変勉強になりました。 ひとつひとつ意味を調べて、なぜこの挙動になるのかコードにコメントに残しました。 まだ自分の言葉で説明しきれませんが、教えていただいたことをこれから応用できるように努力します。 教えていただいて大変助かりました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問