前提
GASを使用してメール送信を行うための一覧を抽出するプログラムを考えています。
プログラミングに関してはほとんど初心者です。
実現したいこと
フォームにてメールアドレス等情報を入力してもらう
↓
(GAS)その一覧のD列を判定し、SチームとTチームに分ける
↓
(GAS)Tチームの情報を別シートに転記
抽出する技術がないため、シートの情報をすべてコピーしたのち、D列にSが含まれていた場合行を削除したら同様のことができるのではないのかと考えました。
文字列の判定は一覧の下から行っており、その前にD列をソートしてSが下に来るようにしています。
おこがましいですが、今回のプログラムに関してもご助言いただきたいですが、行の削除ではない抽出に関してもご助言いただけたら嬉しいです。
発生している問題・エラーメッセージ
具体的にGASでエラーが起きているわけではありません。
開始から終了まで実行はできます。が、動作が不安定です。
①10秒でプログラムが終了したとき
→Sチームが除外されておらず、ただシート内容がコピーされただけ
②40秒前後でプログラムが終了したとき
→想定通りの動作をしている
①と②がおおよそ交互に起こります。
該当のソースコード
function アーカイブ() { // 対象のスプレッドシートを指定 let maildb = SpreadsheetApp.openById("*****************"); let maildb_sheet = maildb.getSheetByName("アドレス"); let copydb_sheet = maildb.getSheetByName("Tチーム"); var maildata_lastRow = maildb_sheet.getLastRow(); var copydata_lastRow = copydb_sheet.getLastRow(); var maildata_lastCol = maildb_sheet.getLastColumn(); maildb_sheet.sort(4, false); copydb_sheet.clear(); copydb_sheet.insertRowsAfter(1,30); maildb_sheet.getRange(1,1,maildata_lastRow,maildata_lastCol).copyTo(copydb_sheet.getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false); maildb_sheet.getRange('A1').activate(); maildb_sheet.getCurrentCell().setValue('タイムスタンプ'); // コピー状態の解除?? const array = ["S","s"] for (const i in array) { for (let j = copydata_lastRow; j > 1; j--) { let range = copydb_sheet.getRange('D' + j); let value = range.getDisplayValue(); if (value.indexOf(array[i]) != -1) { let start_row = j; let num_row = 1; copydb_sheet.deleteRows(start_row, num_row); }; }; }; }
画像

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/01/25 04:52