前提
https://blog.synnex.co.jp/google/gmail-gas/
上記サイトを参考に
Gmailからスプレッドシートへ転記させたいと思っています。
実現したいこと
抽出先シートのD列を作業列として利用したく、
A列~C列にGmaiのデータを抽出したいです。
発生している問題・エラーメッセージ
appendRowを使っているからなのか
D列に数式が入っているとうまく作動してくれません。
setValueでも同様です・・。
該当のソースコード
function searchMails() { const query = 'subject:〇〇 after:2023/1/1' const threads = GmailApp.search(query); const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('リスト'); // リセット const howMany = sheet.getLastRow() - 1; const range = sheet.getRange("A2:C"); if(howMany > 0){ range.clearContent(); } threads.forEach(thread => { const message = thread.getMessages()[0]; //一通目のメールのみ let date = message.getDate(); // 送信日 let fromData = message.getFrom(); // 送信元 let subject = message.getSubject(); // 件名 let data = [date, fromData, subject]; sheet.appendRow(data); }); }; ### 試したこと setValueで試してみました。 threads.forEach(function(thread){ const message = thread.getMessages()[0]; //一通目のメールのみ let date = message.getDate(); // 送信日 let fromData = message.getFrom(); // 送信元 let subject = message.getSubject(); // 件名 const lastRow = sheet.getLastRow() + 1; sheet.getRange(lastRow,1).setValue(date); sheet.getRange(lastRow,2).setValue(fromData); sheet.getRange(lastRow,3).setValue(subject);
appendRowを使っているからなのだと思うなら、使わない書き方をすれば良いのでは???
appendRowをつかわずやってみましたが作業列を追加すると動かなくなってしまいます。
threads.forEach(function(thread){
const message = thread.getMessages()[0]; //一通目のメールのみ
let date = message.getDate(); // 送信日
let fromData = message.getFrom(); // 送信元
let subject = message.getSubject(); // 件名
const lastRow = sheet.getLastRow() + 1;
sheet.getRange(lastRow,1).setValue(date);
sheet.getRange(lastRow,2).setValue(fromData);
sheet.getRange(lastRow,3).setValue(subject);
こちらで再現してみてもいいのですが、悩んでます
動かなくなるというのは、何行目で動かなくなりますか?どのように動いていないことを確認しました?
リセットされた後、Gmailのデータが1件も書き出されなくなります。
なのでスクリプト実行後、スプレッドシートを見るとカラムだけしか残っていない状態です・・。
「リセット」というのは、何行目の処理でしょうか?
'リスト'の構造をサンプルで画像でアップロードしていただくことはできますか?
今日か、明日には、再現してみます。
画像をアップロードいたしました。
リセットは
const howMany = sheet.getLastRow() - 1;
const range = sheet.getRange("A2:C");
if(howMany > 0){
range.clearContent();
}
でA2:Cをクリアしております。
よろしくお願いいたします。
明日、時間あれば、対応させてもらいます。
他の方の回答があればそれはそれでよしとして。
宜しくお願いします。
ありがとうございます。
何卒よろしくお願いいたします。
「D列に数式が入っていると」というのを図で表示していただくことはできますか?
遅くなり申し訳ありません。
一旦、自力でなんとか解決できました。
ご丁寧に対応していただきありがとうございました。
// メール取得
threads.forEach(function(thread){
const message = thread.getMessages()[0]; // 一通目のメールのみ
let date = message.getDate(); // 送信日
let fromData = message.getFrom(); // 送信元
let subject = message.getSubject(); // 件名
const lastRow = sheet.getRange("A:A").getValues().filter(String).length + 1;
sheet.getRange(lastRow,1).setValue(date);
sheet.getRange(lastRow,2).setValue(fromData);
sheet.getRange(lastRow,3).setValue(subject);
});
};
上記で意図通り動いてくれます!
ただこちらだと重く、二次元配列に変換する必要がありそうなので
また勉強してきます・・。
解決してなによりです。あまりお役にたてなくてすいみません。

あなたの回答
tips
プレビュー