はじめに
今回のビジボットでは先日あげた記事の「GmailにすでにあるメールをGASを使ってスプレッドシートに出力する」について、実際のメールが多い環境で実行をしてみたところ実際の数字と異なる結果が確認できた。その原因と、解決するためのGoogleAppsScript (GAS)コードを改めて紹介できればと思います。
↓↓先日の記事は以下↓↓
それでは早速始めていきます!
1.原因
Gmailで検索した結果メールの数と、GoogleAppsScript (GAS)を実行して取得したはずの件数が完全に一致しないのです。
理由はデバックして確認したところ配列の値で取得できてなさそうな部分があることがわかりました。

デバックする前に見つけた記事も似たような状態で困っていたので、その記事を参考に処理方法を変更して読み解いてみました。
2.処理の追加
今回追加した処理は大きく2つです。
- forの入れ子【forを入れ子にして取得できなかった値を取得する】
- 改行処理【setValue処理(行に取得した値をセット)が完了したら次の行にずれる】
1つずつ解説していきます。
forの入れ子
前回作成したコードのピックアップした部分はこちら
※見やすくするためにLogger.log()は外してます
1 2 3 4 5 6 7 |
for(var i=0;i < myMessages.length;i++){ sheet.getRange(i + 2, 1).setValue(myMessages[i][0].getId()); sheet.getRange(i + 2, 2).setValue(myMessages[i][0].getFrom()); sheet.getRange(i + 2, 3).setValue(myMessages[i][0].getDate()); sheet.getRange(i + 2, 4).setValue(myMessages[i][0].getSubject()); sheet.getRange(i + 2, 5).setValue(myMessages[i][0].isInInbox()); } |
そして今回作成したコードのピックアップした部分がこちら
このあと詳しく記載していきます。
1 2 3 4 5 6 7 8 9 10 11 12 |
for(var i = 0;i<myMessages.length;i++){ var myMessagesLen = myMessages[i].length Logger.log(myMessagesLen); for(var j = 0;j<myMessagesLen;j++){ sheet.getRange(rowCnt, 1).setValue(myMessages[i][j].getId()); sheet.getRange(rowCnt, 2).setValue(myMessages[i][j].getFrom()); sheet.getRange(rowCnt, 3).setValue(myMessages[i][j].getDate()); sheet.getRange(rowCnt, 4).setValue(myMessages[i][j].getSubject()); sheet.getRange(rowCnt, 5).setValue(myMessages[i][j].isInInbox()); rowCnt = rowCnt + 1; //値をsetしたら(処理を実行したら)一行下にずれる } } |
まず、変数myMessages①より小さいときは中に記載された処理を実行します。
変数myMessageLen②に変数myMessages①で取得した値で取れていない値を取得します。
※以下例でいうと、0[3]の3の部分。ここには要素がそれぞれ3つ入っているため、これらも取得の対象となります

そのため、以下処理を追加しています。
処理にLogger.log(myMessageLen)を追加している為、roopされて実行される度にログにmyMessageLenに入っている値が表示されます。
このfor処理はそのmyMessageLenの数をそれぞれ繰り返すという処理です。
その為、3回、1回 ….. 72回、1回というように処理をしています。
1 2 3 4 5 6 7 8 9 |
Logger.log(myMessagesLen); for(var j = 0;j<myMessagesLen;j++){ sheet.getRange(rowCnt, 1).setValue(myMessages[i][j].getId()); sheet.getRange(rowCnt, 2).setValue(myMessages[i][j].getFrom()); sheet.getRange(rowCnt, 3).setValue(myMessages[i][j].getDate()); sheet.getRange(rowCnt, 4).setValue(myMessages[i][j].getSubject()); sheet.getRange(rowCnt, 5).setValue(myMessages[i][j].isInInbox()); rowCnt = rowCnt + 1; //値をsetしたら(処理を実行したら)一行下にずれる } |
以下がLogger.log(myMessageLen)の取得した回数です。
意図する動きになってました。

改行処理
次は改行処理です。当初作成した処理は処理して繰り上がり、処理して繰り上がり…となってましたが、今回追加したプログラムで改行を追加しない場合は2回目のforを実行中は同じ値が上書きされてしまいます。
簡単に説明するとmyMessageLenが3だった場合、1回目はスプレッドシートの1行目の1列目に「AAA」という値が入ります。しかし、本来2回目の処理で2行目の1列目に新しい値「BBB」が入って欲しいですが、改行処理を入れないと「AAA」に「BBB」が上書きされてしまいます。
その為以下を追加してます。
1 |
rowCnt = rowCnt + 1; //値をsetしたら(処理を実行したら)一行下にずれる |
さらに「sheet.getRange(rowCnt, 1)」で行の指定をrowCntにすることで毎に繰り上がっていきます。
1回目の処理は(1,1)。2回目の処理は(2,1)。3回目の処理は(3,1)。。。という形で行を改行していきます。
今回はこれで実行できたことは確認できたので終わりとします。
他にも色々作成してみたいと思います!ありがとうございました!