前提・実現したいこと
毎朝更新されるTodoリストを作成しようとしています。
→時間をトリガーとして、進捗状況が「完了」のタスクは行ごと削除、
継続・ルーチンワーク(I列が○のもの)は進捗状況のみリセットして「待機中」とする。
具体的には、
前日シートのI列に「○」がある場合、翌日新しいシートのB列に「待機中」と表示
同様に「×」の場合、「完了」と表示。
B列に完了と表示された行は削除する。となるように設定しようとしています。
該当のソースコード
// 本日のTODOを作成する function addTodoSheet() { // 前日からコピーする const ss = SpreadsheetApp.getActiveSpreadsheet(); const yesterday = getYesterdayYMD() const today = getNowYMD() const sh = ss.getSheetByName(yesterday) sh.copyTo(ss).setName(today) const todaySheet = ss.getSheetByName(today) ss.setActiveSheet(todaySheet) ss.moveActiveSheet(1) ss.setActiveSheet(todaySheet) // TODOを初期化する const lastRow = sh.getLastRow(); const nsh = ss.getActiveSheet(); for(let i = 1; i <= lastRow; i++) { if( nsh.getRange(i, 9).getValue() == "○" ){ nsh.getRange(i, 8).setValue("待機中") } else if (nsh.getRange(i, 9).getValue() == "×" ){ nsh.getRange(i, 8).setValue("完了") } } for(let i = lastRow; i >= 1; i--) { if( nsh.getRange(i, 8).getValue() == "完了" ){ nsh.deleteRows(i); } } } // yyyymmdd形式で日付を取得する function getNowYMD(){ const dt = new Date(); const y = dt.getFullYear(); const m = ("00" + (dt.getMonth()+1)).slice(-2); const d = ("00" + dt.getDate()).slice(-2); const result = m + d; return result; } // yyyymmdd形式で日付を取得する function getYesterdayYMD(){ const dt = new Date(); dt.setDate(dt.getDate() - 1); const y = dt.getFullYear(); const m = ("00" + (dt.getMonth()+1)).slice(-2); const d = ("00" + (dt.getDate())).slice(-2); const result = m + d; return result; } // スプレッドシートのメニューからPDF作成用の関数を実行出来るように、「スクリプト」というメニューを追加。 function onOpen() { const sheet = SpreadsheetApp.getActiveSpreadsheet(); const entries = [ { name : "TODO作成", functionName : "addTodoSheet" }, ]; sheet.addMenu("スクリプト", entries); };
試したこと
(i, 8)の指定が間違っているのではないかと思い、(i, 2)に変更しましたが関係ないようでした。
補足情報
GAS初心者のため、ほかの方が公開しているテンプレートをアレンジしようと思い進めている状況です。
元のテンプレートではそもそもH列が進捗状況の列になっていたので、
このようなソースになっていると考えています。
どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー