Action

FlickDate JP(フリック日付入力)

Posted by wreckin crew from JP, Last update about 20 hours ago

FlickDate JP: 数字フリックだけで完結する爆速日付入力

Draftsでの日次記録やタスク管理を、もっとスムーズに。
日本語環境の「数字フリック入力」に最大限最適化した、日付入力スクリプトです。
キーボードを切り替えることなく、数字と記号の組み合わせだけで「4月14日(火)」といった日本形式の日付を瞬時に挿入できます。

✨ 主な特徴

数字キーボードで完結: .(ドット)や >(不等号)は数字フリックで入力可能なため、文字入力の切り替えストレスがありません。
当日入力の簡略化: . または 0 を打つだけで今日の日付を指定できます。
直感的な曜日指定: 日曜(0)〜土曜(6)の番号で、次回の曜日や前回の曜日を素早く計算。
連続日程生成: *n 記法により、複数日分の日付を一括で作成できます。

📝 入力記法ガイド

プロンプトが表示されたら、以下の形式で入力してください。

  • . または 0 : 当日(今日)
  • 3. : 3日後(数値の後にドット)
  • .3 : 3日前(数値の前にドット)
  • >n : 次の指定曜日(nは0:日〜6:土。例: >0 で次の日曜 / >6 で次の土曜)
  • <n : 前の指定曜日(例: <1 で前の月曜)
  • 25 : 今月の指定日(例: 25日)
  • 4/20 : 指定した月日
  • 2026/5/1 または 26/5/1 : 年/月/日の指定

⠀🔥 連続日程の生成(*記法)

日付指定の後に *n を付けると、その日から n日間分の日付をまとめて挿入します。

入力例:

  • .*3 : 今日から3日間分の日付
  • >1*5 : 次の月曜日から5日間分の日付

出力イメージ(.*3 の場合):
3月18日(水)
3月19日(木)
3月20日(金)

週次レビューの準備や、連休の予定、ルーチンワークの書き出しに非常に便利です。

💡 Tips

記号(> や <)を重ねることで、さらに遠い日程も指定可能です。
例:>>0(再来週の日曜日)
日本での使い勝手を追求したこのアクションが、あなたのDraftsライフをより快適にすることを願っています。

Steps

  • script

    // Drafts用 日付入力スクリプト
    
    /**
     * 日付ショートカットの解析
     * @param {string} input - 入力文字列 (例: "3.", ">0", "<6", "25", "4/14")
     */
    function parseDateShorthand(input) {
        const today = new Date();
        let targetDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
        
        if (input === "." || input === "0") {
            return targetDate;
        }
    
        const afterMatch = /^(\d+)\.$/.exec(input);
        const beforeMatch = /^\.(\d+)$/.exec(input);
    
        const nextDowMatch = /^([>]+)([0-6])$/.exec(input);
        const prevDowMatch = /^([<]+)([0-6])$/.exec(input);
        const fullDateMatch = /^(\d{2,4})\/(\d{1,2})\/(\d{1,2})$/.exec(input);
        const monthDayMatch = /^(\d{1,2})\/(\d{1,2})$/.exec(input);
        const onlyNumber = /^(\d+)$/.exec(input);
    
        if (afterMatch) {
            targetDate.setDate(targetDate.getDate() + parseInt(afterMatch[1]));
        } else if (beforeMatch) {
            targetDate.setDate(targetDate.getDate() - parseInt(beforeMatch[1]));
        } else if (nextDowMatch) {
            const extraWeeks = nextDowMatch[1].length - 1; 
            const targetDOW = parseInt(nextDowMatch[2]); 
            const currentDOW = targetDate.getDay();
            let daysToAdd = (targetDOW - currentDOW + 7) % 7;
            if (daysToAdd === 0) daysToAdd = 7; 
            targetDate.setDate(targetDate.getDate() + daysToAdd + (extraWeeks * 7));
        } else if (prevDowMatch) {
            const extraWeeks = prevDowMatch[1].length - 1; 
            const targetDOW = parseInt(prevDowMatch[2]); 
            const currentDOW = targetDate.getDay();
            let daysToSub = (currentDOW - targetDOW + 7) % 7;
            if (daysToSub === 0) daysToSub = 7; 
            targetDate.setDate(targetDate.getDate() - (daysToSub + (extraWeeks * 7)));
        } else if (fullDateMatch) {
            let year = parseInt(fullDateMatch[1]);
            if (year < 100) year += 2000;
            targetDate = new Date(year, parseInt(fullDateMatch[2]) - 1, parseInt(fullDateMatch[3]));
        } else if (monthDayMatch) {
            targetDate = new Date(today.getFullYear(), parseInt(monthDayMatch[1]) - 1, parseInt(monthDayMatch[2]));
        } else if (onlyNumber) {
            targetDate.setDate(parseInt(onlyNumber[1]));
        } else {
            return null;
        }
        return targetDate;
    }
    
    function formatDateJapanese(date) {
        const days = ["日", "月", "火", "水", "木", "金", "土"];
        return `${date.getMonth() + 1}月${date.getDate()}日(${days[date.getDay()]})`;
    }
    
    const p = Prompt.create();
    p.title = "日付入力";
    
    p.message = "当日: . または 0\n曜日: >0(次日) / >6(次土) / <0(前日)\n相対日: 3. (後) / .3 (前)\n連続: .*3 (今日から3日間)";
    
    p.addTextField("shorthand", "入力", "", {
        "keyboard": "numbersAndPunctuation",
        "wantsFocus": true
    });
    p.addButton("挿入");
    
    if (p.show()) {
        let input = p.fieldValues["shorthand"].trim();
        let baseInput = input;
        let repeatCount = 1;
        const repeatMatch = input.match(/^(.*?)\*(\d+)$/);
        if (repeatMatch) {
            baseInput = repeatMatch[1];
            repeatCount = parseInt(repeatMatch[2], 10);
        }
    
        const resultDate = parseDateShorthand(baseInput);
        if (resultDate && !isNaN(resultDate.getTime())) {
            let resultStrings = [];
            for (let i = 0; i < repeatCount; i++) {
                let d = new Date(resultDate.getTime());
                d.setDate(d.getDate() + i);
                resultStrings.push(formatDateJapanese(d));
            }
            editor.setSelectedText(resultStrings.join("\n"));
        } else {
            app.displayWarningMessage("無効な入力です");
        }
    }

Options

  • After Success Default
    Notification Error
    Log Level Info
Items available in the Drafts Directory are uploaded by community members. Use appropriate caution reviewing downloaded items before use.