LogoFLO.W 文档
常见问题

模板错误修复

修复 FLO.W 模板中可能出现的错误

由于 FLO.W 系统的体量过于庞大,因此有可能在各种细节角落存在一些错误,本文档即为修复这些错误而建。

剪藏完成按钮错误修复

Important

如果您的模板是在 2025.11.03 之后复制的,则不需要处理本条修复

问题表现

在剪藏文章中,点击【完成】按钮,无法将阅读状态改为【已完成】

image

解决方法

点击【完成】这个字段,会弹出如下提示

image

然后再点击【编辑属性 - 编辑自动化】,然后点击出现错误的地方

image

把【已删除选项】改成【已完成】

image

最后点击保存按钮即可

image

习惯打卡热力图的错误修复

Important

如果您的模板是在 2025.11.03 之后复制的,则不需要处理本条修复

问题表现

当月份来到 11 月或者 12 月的时候,热力图的显示就会无法正确对齐,如下图所示:

image

解决方法

复制下面这段代码,然后覆盖原有的代码即可

/* ========== 打卡统计看板 (基于当前月份) - 集成习惯分类和月度目标 ========== */
lets(
    /* --- 核心变量 --- */
    boardReferenceDate, now(), /* 看板始终基于当前日期和时间 */
    currentYear, boardReferenceDate.formatDate("YYYY"), /* 当前年份字符串 */
    currentMonth, boardReferenceDate.formatDate("MM"), /* 当前月份字符串 */
    boardYearMonth, currentYear + "/" + currentMonth, /* 当前年月,例如 "2025/05" */

    /* --- 今日打卡状态 --- */
    todayDateText, now().formatDate("YYYY/MM/DD"),
    allRecords, prop("打卡记录"), /* 所有打卡记录 */
    isCheckedInToday, allRecords.filter(current.prop("日期").formatDate("YYYY/MM/DD") == todayDateText).length() > 0,
    todayCheckInStatusText, if(isCheckedInToday, "✅ 今天已打卡", "❌ 今天未打卡"),

    habitCategory, prop("习惯分类"), /* 获取习惯分类 */
    monthlyLimitTarget, prop("目标/上限"), /* 获取每月上限或下限目标值 */

    /* 根据习惯分类调整标记和颜色 */
    triggerMark, if(habitCategory == "好习惯", "✓", "x"),
    userDefinedColorForHabit, prop("习惯颜色"),
    triggerColor, if(
        habitCategory == "好习惯",
        "green",
        empty(userDefinedColorForHabit) ? "red" : userDefinedColorForHabit
    ),

    /* --- 1. 计算当月触发/完成次数 --- */
    /* allRecords 已在上方定义 */
    monthlyTriggers,
    allRecords.filter(
        current.prop("日期").formatDate("YYYY/MM") == boardYearMonth
    ).length(),

    /* --- 2. 构建第一行显示的习惯信息字符串 (对好坏习惯均显示) --- */
    habitInfo,
        lets(
            baseText, format("本月 ") + monthlyTriggers + " 次",
            actualSuffixText, /* 初始化后缀文本 */
                if(empty(monthlyLimitTarget),
                    "", /* 如果没有设置目标/上限,则后缀为空 */
                    if(habitCategory == "好习惯",
                        lets(
                            neededForTarget, monthlyLimitTarget - monthlyTriggers,
                            if(neededForTarget <= 0,
                                "|已达标",
                                "|还需 " + format(neededForTarget) + " 次"
                            )
                        ),
                        /* 当为坏习惯时 */
                        lets(
                            remainingCount, monthlyLimitTarget - monthlyTriggers,
                            if(remainingCount >= 0,
                                "|剩余 " + format(remainingCount) + " 次",
                                "|已超额 " + format(abs(remainingCount)) + " 次"
                            )
                        )
                    )
                ),
            (baseText + actualSuffixText).style("b", "u") /* 组合并应用样式 */
        ),

    /* --- 3. 月份和星期表头 --- */
   monthHeader,
    lets(
        monthNum, boardReferenceDate.formatDate("MM").toNumber(),
        monthText, if(monthNum >= 11,
            boardReferenceDate.formatDate("MMM"),  /* 11、12月用缩写 */
            boardReferenceDate.formatDate("MM") + "月"  /* 1-10月用数字 */
        ),
        monthText.style(
            triggerColor + "_background", "c", "b", triggerColor
        )
    ),

    dayAbbreviations, ["M", "T", "W", "T", "F", "S", "S"],
    weekHeader, dayAbbreviations.map(
        lets(
            dayAbbr, current,
            dayIndex, index,
            systemToday, now().day(),
            isToday, (systemToday == 0 && dayIndex == 6) || (systemToday != 0 && systemToday - 1 == dayIndex),
            dayAbbr.style(
                triggerColor + "_background", "c", "b",
                isToday ? ((triggerColor == "yellow" || triggerColor == "pink" || triggerColor == "green" || triggerColor == "gray") ? "brown" : "white") : triggerColor
            )
        )
    ).join(" "),
    fullHeader, monthHeader + " " + weekHeader,

    /* --- 4. 每周打卡热图 --- */
    firstDayOfBoardMonth, parseDate(currentYear + "-" + currentMonth),
    startDayOfWeekForBoardMonth, firstDayOfBoardMonth.day(),
    week1StartDate, firstDayOfBoardMonth.dateSubtract((startDayOfWeekForBoardMonth + 6) % 7, "days"),
    weekDaysOffsets, [0, 1, 2, 3, 4, 5, 6],
    weekOffsetsForMap, [0, 7, 14, 21, 28, 35],

    allWeekViewsRendered, weekOffsetsForMap.map(
        lets(
            daysToAdd, current,
            currentWeekStartDate, week1StartDate.dateAdd(daysToAdd, "days"),
            currentWeekIndex, index,
            isThisWeekPotentiallyRelevant, currentWeekStartDate.formatDate("YYYY/MM") == boardYearMonth || currentWeekStartDate.dateAdd(6, "days").formatDate("YYYY/MM") == boardYearMonth,
            displayThisWeek, (currentWeekIndex < 5) || (currentWeekIndex == 5 && isThisWeekPotentiallyRelevant),

            weekViewContent, displayThisWeek ? (
                (currentWeekStartDate.formatDate("WW") + "周").style(
                    currentWeekStartDate.formatDate("YYYY/WW") == now().formatDate("YYYY/WW") ? triggerColor + "_background" : "",
                    "c", "b", triggerColor
                ) + " " +
                weekDaysOffsets.map(
                    lets(
                        dayOffset, current,
                        currentDayInGrid, currentWeekStartDate.dateAdd(dayOffset, "days"),
                        isCurrentDisplayMonth, currentDayInGrid.formatDate("YYYY/MM") == boardYearMonth,
                        dailyTriggersCount, isCurrentDisplayMonth ?
                            allRecords.filter(
                                current.prop("日期").formatDate("YYYY/MM/DD") == currentDayInGrid.formatDate("YYYY/MM/DD")
                            ).length() : 0,
                        isActualToday, currentDayInGrid.formatDate("YYYY/MM/DD") == todayDateText, /* 使用 todayDateText 比较 */

                        (dailyTriggersCount > 0 ? triggerMark : (isCurrentDisplayMonth ? "·" : " ")).style(
                            dailyTriggersCount > 0 ? triggerColor + "_background" : (isActualToday && isCurrentDisplayMonth ? "blue_background" : ""),
                            "c", "b",
                            dailyTriggersCount > 0 ? triggerColor : (isCurrentDisplayMonth ? (isActualToday ? "white" : "gray") : "")
                        )
                    )
                ).join(" ")
            ) : "",
            weekViewContent
        )
    ).filter(current != "").join("\n"),

    /* --- 构建本月目标/上限的文本行 (for summary) --- */
    monthlyTargetDisplayLine,
        if(empty(monthlyLimitTarget),
            "", /* 如果目标/上限为空,则此行为空 */
            if(habitCategory == "好习惯",
                format("本月目标 ") + format(monthlyLimitTarget) + " 次",
                format("本月上限 ") + format(monthlyLimitTarget) + " 次"
            )
        ),

    /* --- 计算上个月和年度统计 (for summary) --- */
    dateForLastMonth, boardReferenceDate.dateSubtract(1, "months"),
    lastMonthYearMonth, dateForLastMonth.formatDate("YYYY/MM"),
    lastMonthTriggers, allRecords.filter(
        current.prop("日期").formatDate("YYYY/MM") == lastMonthYearMonth
    ).length(),

    percentageChangeText, /* 调整 "从0增加" 的措辞 */
        if(lastMonthTriggers == 0,
            /* 当上个月为0次时 */
            if(monthlyTriggers > 0,
                "本月增加 " + format(monthlyTriggers) + " 次", /* 修正:去掉重复的 "上个月 0" */
                "无变化" /* 如果本月也为0次,则为无变化 */
            ),
            /* 当上个月不为0次时,计算百分比 */
            lets(
                diff, monthlyTriggers - lastMonthTriggers,
                percentage, round(diff / lastMonthTriggers * 100),
                if(percentage == 0,
                    "无变化",
                    if(percentage > 0,
                        "增加 " + format(percentage) + "%",
                        "下降 " + format(abs(percentage)) + "%"
                    )
                )
            )
        ),
    lastMonthSummary, "上个月 " + format(lastMonthTriggers) + " 次|" + percentageChangeText,

    thisYearTriggers, allRecords.filter(
        current.prop("日期").formatDate("YYYY") == currentYear
    ).length(),
    thisYearSummary, "今年总计 " + format(thisYearTriggers) + " 次",

    /* --- 5. 最终拼接所有部分 --- */
    finalOutput,
    todayCheckInStatusText + "\n" +
    habitInfo + "\n" +
    fullHeader + "\n" +
    allWeekViewsRendered + "\n\n" +
    if(empty(monthlyTargetDisplayLine), "", monthlyTargetDisplayLine + "\n") +
    lastMonthSummary + "\n" +
    thisYearSummary + "\n",
    finalOutput
)

剪藏 - 关联字段最后编辑时间

Important

如果您的模板是在 2025.11.02 之后复制的,则不需要处理本条修复

问题表现

打开剪藏模块中的文章,找到【关联字段最后编辑时间】这个字段,点击之后发现如下图所示的错误:

image

解决方法

复制以下代码,然后完整覆盖即可

lets(
	project,prop("关联项目").map(current.prop("上次编辑时间")),
	task,prop("关联任务").map(current.prop("上次编辑时间")),
	extract,prop("关联摘录").map(current.prop("Last Edited Time")),
	author,prop("出自").map(current.prop("Last Edited Time")),
	category,prop("书单分类").map(current.prop("Last Edited Time")),
	subArea,prop("次级领域").map(current.prop("Last Edited Time")),
	note,prop("关联笔记").map(current.prop("上次编辑时间")),
	Area,prop("一级领域").map(current.prop("Last Edited Time")),
	content,prop("Last Edited Time"),

	[Area,note,subArea,category,author,author,extract,task,project,content].flat().unique().sort().reverse().first()
)

这次改动不影响任何功能,只是删去了一段无用的代码。

主页导航错误修复

Important

如果您的模板是在 2025.09.14 之后复制的,则不需要处理本条修复

问题表现

在某些情况下,如果你打开数据库,点击顶部的【主页】按钮

主页按钮

却跳转到了网页的某个地方

跳转错误

请按照以下方式进行修复。

解决方法

愿望按钮修复

Important

如果您的模板是在 2025.09.14 之后复制的,则不需要处理本条修复

问题表现

在【生活 - 愿望】模块中,存在一个【加入已购买】的按钮

加入已购买按钮

如果你点击这个按钮出现错误,可能是个这个按钮中的某个步骤出现了错误

按钮错误

解决办法

按照下图所示方法,重新编辑一下这个按钮即可

重新编辑按钮