Google apps script Can';t设置复选框数据验证

Google apps script Can';t设置复选框数据验证,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我已经尝试自动添加复选框作为数据验证。选中的为1,未选中的为0。 如果我试图手动设置,一切正常。当我尝试使用一些字符串,比如'Approved'作为默认值时,它也在工作。我尝试使用'true'字符串,但也遇到了同样的问题。若我试图手动修改验证—数据验证窗口中的所有内容都是正确的,然后我按下“OK”(无任何更改)—问题就消失了 示例代码: function make_checkboxes(){ var cell = SpreadsheetApp.getActive().getActiveR

我已经尝试自动添加复选框作为数据验证。选中的为1,未选中的为0。 如果我试图手动设置,一切正常。当我尝试使用一些字符串,比如
'Approved'
作为默认值时,它也在工作。我尝试使用
'true'
字符串,但也遇到了同样的问题。若我试图手动修改验证—数据验证窗口中的所有内容都是正确的,然后我按下“OK”(无任何更改)—问题就消失了

示例代码:

function make_checkboxes(){
    var cell = SpreadsheetApp.getActive().getActiveRange();
    var rule = SpreadsheetApp.newDataValidation().requireCheckbox(1, 0).build();
    cell.setDataValidation(rule);
}
var range = spreadsheet.getSheetByName('hacks_and_workarounds').getRange('A1');
valid_rule = range.getDataValidation();
SpreadsheetApp.getActiveSpreadsheet().getActiveRange().setDataValidation(valid_rule);
复制步骤:

  • 在任何范围上运行函数
  • 勾选复选框-复选框已消失,单元格值为1且“无效:此单元格的内容违反其验证规则”

  • 当我试图找到一个解决方法并复制验证(从脚本)时,我出现了一个错误:

    “消息详细信息 访问id为1UWvTC3mswQ0lh23eZDq49lr2VNeQ8tEMrzlpF0Kv07c的文档时,服务电子表格失败。“

    示例代码:

    function make_checkboxes(){
        var cell = SpreadsheetApp.getActive().getActiveRange();
        var rule = SpreadsheetApp.newDataValidation().requireCheckbox(1, 0).build();
        cell.setDataValidation(rule);
    }
    
    var range = spreadsheet.getSheetByName('hacks_and_workarounds').getRange('A1');
    valid_rule = range.getDataValidation();
    SpreadsheetApp.getActiveSpreadsheet().getActiveRange().setDataValidation(valid_rule);
    

    问题

    带有数字约束的复选框
    DataValidation
    将导致“无效:此单元格的内容违反其验证规则”错误

    解释和测试

    我决定重现这个问题,并在示例电子表格上复制了相同的
    DataValidation
    builder(未设置格式,验证已清除,等等)。这个问题被成功地重现了,但引起我注意的是
    getCriteriaValues()
    方法的输出。为了进行测试,我使用了以下函数:

    function getDataValidation() {
        const ss = SpreadsheetApp.getActiveSpreadsheet();
    
        const sh = ss.getActiveSheet();
    
        const cell = sh.getActiveCell();
    
        const dataValidation = cell.getDataValidation();
    
        const allowed = dataValidation.getCriteriaValues();
    
        const ui = SpreadsheetApp.getUi();
    
        ui.alert(`Allowed values: ${allowed.join(", ")}, type: ${typeof allowed[0]}`);
    }
    
    产出表明:

    允许的值:1.0,0.0,类型:字符串

    请注意值的类型(人们可能希望它是一个
    数字
    )。我添加了一个小实用程序,用于检查给定单元格的当前值、显示值和数字格式

    以下是使用的实用程序(供参考):

    如果格式设置为自动(默认),则输出如下:

    解决方案

    如果要以编程方式设置正确的格式,可以将(或其批处理等效项)与
    “@”
    参数一起使用(强制将内容设置为纯文本):

    注释

  • 我不知道为什么会这样。假设任何值都应该是正确的,因为文档说明参数类型是
    any
    (例如,检查TS声明文件)
  • 库珀与一个相关问题联系在一起——在撰写本文时,不幸的是,该报告没有得到任何支持,因此被关闭(可能是由于不活动)
  • 参考资料

  • requireCheckbox()
    方法
  • getCriteriaType()
    方法
  • getNumberFormat()
    方法
  • getDisplayValue()
    方法

  • 肯定有一些意想不到的结果。有一个问题与此类似@Cooper-能够复制我自己。验证需要单元格的纯文本格式(测试表明1.0或0.0作为type
    string
    返回)。我不明白为什么,但这可能是一个文档错误,将添加一个答案。我发现使用TRUE和FALSE会导致问题,如果从菜单中使用insertCheckBox方法,值就是这些问题。我还发现使用“1”和“0”也不起作用。这个盒子的签名我觉得很难辨认understand@Cooper-我还发现规范令人困惑,但它有一个更简单的解释-d.ts文件使用
    any
    类型声明了
    requirecBox
    ,该类型很可能在文档中转换为
    Object
    。虽然我同意,这不是一个借口,有一个不同的实际合同比广告。将检查真/假,但我怀疑这两种情况都是一样的。它显然不接受布尔基元或数字。 The value is "1.0 of type string" Display value is "1.0" of type string Format is The value is "true of type string" Display value is "true" of type string Format is
    rng.setNumberFormat("@"); //assuming rng is defined elsewhere