You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JavaScript在InDesign中实现排除下伸字符的下划线效果

问题根因与修复方案

错误1:下伸字符未被排除的原因

  1. InDesign中app.selection返回的是选区对象集合,如果你选中的是一段文本,拿到的是Text类型对象而非拆分后的单个字符数组,直接遍历只能拿到整个选区对象,无法逐个判断字符
  2. 你直接将InDesign的Character实例和字符串做相等判断,实际需要访问Character.contents属性才能拿到字符的文本内容做匹配

错误2:自定义参数不生效的原因

你给下划线属性赋值时误用了双等号==,双等号是比较运算符,不会执行赋值操作,要改成单等号=才能把自定义的粗细和偏移量写入属性。

其他可优化问题

  • 对话框布局层级错误,原来的代码中标签和输入框不在同一行,显示会错位
  • 取消对话框的提示文案不符合功能逻辑
  • 未处理选中多个对象、选中非文本内容的边界情况

修正后完整代码

// 排除下伸字符的下划线添加脚本
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

if (app.documents.length != 0){
    try {
        if (parseFloat(app.version) < 6) {
            main();
        } else {
            app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "Add Underline Skip Descendants");
        }
    } catch (error) {
        alert( error + " (Line " + error.line + " in file " + error.fileName + ")");
    }
}else{
    alert("请先打开一个文档再运行此脚本。");
}

function main(){
    if(app.selection.length != 0 && app.selection[0].constructor.name === "Text"){
        myDisplayDialog();
    } else {
        alert("请先选中需要处理的文本内容。");
    }
}

function myDisplayDialog(){
    var myDoc = app.activeDocument;
    var selectedText = app.selection[0];
    var myDialog = app.dialogs.add({name:"下划线设置"});
    var myLabelWidth = 70;  
    with(myDialog.dialogColumns.add()){
        with(borderPanels.add()){
            with(dialogRows.add()){
                staticTexts.add({staticLabel:"下划线粗细:", minWidth:myLabelWidth});
                var myStroke = measurementEditboxes.add({editValue:1, editUnits:MeasurementUnits.points});
            }
            with(dialogRows.add()){
                staticTexts.add({staticLabel:"下划线偏移量:", minWidth:myLabelWidth});
                var myOffset = measurementEditboxes.add({editValue: -2, editUnits:MeasurementUnits.points});
            }
        }
    }

    var myResult = myDialog.show();
    if(myResult == true){
        var strokeVal = myStroke.editValue;
        var offsetVal = myOffset.editValue;
        myDialog.destroy();
        underline(selectedText.characters, strokeVal, offsetVal);
    } else {
        myDialog.destroy();
        alert("已取消操作");
    }
}

function underline(charCollection, stroke, offset){
    var len = charCollection.length;
    const doNotUnderline = ['g','j','p','q','y', 'G', 'J', 'P', 'Q', 'Y']; // 不需要匹配大写可删除对应字符
    for (var i=0; i < len; i++){
        try{
            var myChar = charCollection[i];
            var charContent = myChar.contents;
            if (!includes(charContent, doNotUnderline)){
                myChar.underline = true;
                myChar.underlineWeight = stroke;
                myChar.underlineOffset = offset;
            } else {
                myChar.underline = false;
            }
        }catch(r){
            alert(r.description);
            break;
        }
    }
}

function includes(elemento, array){
    var len = array.length;
    for(var i=0; i<len ;i++){
        if(array[i] == elemento){
            return true;
        }
    }
    return false;
}

内容的提问来源于stack exchange,提问作者Stefania D'Eri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:36:02