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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

969閲覧

Google Apps Scriptにて、特定の列の最終行を取得したい。

ComCom

総合スコア7

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/02/18 05:17

前提・実現したいこと

初心者です。
Google Apps Scriptにて、Gメールからスプレッドシートへ自動入力するためのスクリプトを作成中です。
スプレッドシートに入力される際に、特定の列(例えばA列など)の最終行を取得して、その次の行から入力されるようにしたいです。

現状のコードですと、実行した際にシート全体のセル中で一番下に入力されてる文字を取得して、その次の行にメール内容が入力されます。
そうではなく、特定の列を指定して、その列の最終行の次の行に入力されるようにしたいです。

具体的に例えば、、、C列は一番最後に文字が入ってるセルが10行目、A列は一番最後に文字が入ってるセルが5行目というシートでこのスクリプトを実行した場合、A列の最終行のみを取得するように設定して、その次の6行目に入力されるという結果にしたいです。(現状のコードで実行すると、11行目に入力されます。)

色々調べたのですが、いまいち解決策に辿りつけませんでした。。。
どなたか、ご教授頂けますと幸いです。よろしくお願いいたします。

該当のソースコード

function searchContactMail() {

/* Gmailから特定条件のスレッドを検索しメールを取り出す */
var strTerms = '()';
var myThreads = GmailApp.search(strTerms, 0, 5); //条件にマッチしたスレッドを取得
var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する

var valMsgs = [];

/* 各メールから日時、送信元、件名、内容を取り出す*/
for(var i = 0;i < myMsgs.length;i++){

valMsgs[i] = []; valMsgs[i][0] = myMsgs[i][0].getDate(); valMsgs[i][1] = myMsgs[i][0].getFrom(); valMsgs[i][3] = myMsgs[i][0].getSubject(); valMsgs[i][2] = myThreads[i].getPermalink();

}

/* スプレッドシートに出力 */
var sheet = SpreadsheetApp.getActive().getSheetByName('test');
sheet.getRange(sheet.getLastRow()+1, 1, i, 4).setValues(valMsgs); //シートに貼り付け

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記の関数を呼び出して、引数指定シートオブジェクト・指定列(A列なら1)で指定列の最終使用行を得られます。呼び出しで得られた行の次行からデータを追記するようにすればよいかと思います。

この関数の仕組みは、シート全体の最終行を取得してから、指定列の最終使用行を1行ずつ上に空白かどうか見ていくという内容です。

//シート・列を指定して最終使用行を取得する(getValue()を使用) function _getLastRow(sheet,col){ var lastRow = 0 for (var i = sheet.getLastRow(); i>0; i--) { if(sheet.getRange(i, col).getValue() != '') {    break;   }  } lastRow = i return lastRow } //シート・列を指定して最終使用行を取得する(配列を使用) function _getLastRow2(sheet,col){ var lastRow = 0 var ary =[[]] ary = sheet.getRange(1,col,sheet.getLastRow()).getValues() for (var i = ary.length-1; i>-1; i--) { if(ary[i][0] != '') {    break;   }  } lastRow = i return lastRow +1 //配列添字数との差を加算 }

投稿2018/02/19 01:38

編集2018/02/19 04:59
jinshan

総合スコア107

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

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

ComCom

2018/02/19 02:48

ご回答ありがとうございます。 仕組みは理解できたのですが、お答え頂いた関数を実行すると下記のようなエラーメッセージが出てしまいます。。。解決策を教えて頂けませんでしょうか。 "メソッド getRange(number,(class)) が見つかりません。"
退会済みユーザー

退会済みユーザー

2018/02/19 03:37

> jinshanさんへ 横から失礼致します。 僭越ながら、提示されたコードは以下2点の理由で修正されたほうが良いと思います。 1.ループ中のAPIでのセル参照、判定は処理速度の低下(負荷)につながります。 ループ前に一旦配列にセットし、走査したほうが良いと思います。 2.ループ中のブレーク判定式ですが、最終行が「0」の場合も考慮したほうが良いと思います。 > ComComさんへ 修正したコードを提示したほうが良いと思います。
jinshan

2018/02/19 06:09 編集

stshishoさんのご指摘に関して修正しました。関数はgetValue()の繰返しと配列を使用したものの2つを作成しました。所要時間や添字の差異など比較にご使用ください。 エラーは私も1度再現しましたが、スクリプト修正の過程で出なくなって、書き込んだスクリプトも上書きしまったのですみません、原因判明してません。。 最終行のsheet.getLastRow()部分を _getLastRow(sheet,1)や_getLastRow2(sheet,1)に置き換えて実行してみてください
ComCom

2018/02/19 08:09 編集

jinshan様 stshisho様 無事出来ました。ずっと悩んでおりましたので解決してよかったです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問