使用Apps脚本在Google表格中放置复选框

时间:2018-05-22 11:02:45

标签: checkbox google-apps-script google-sheets

我知道复选框是Google表格中相对较新的功能,因此我正在尝试找到一种在单元格中自动创建复选框的方法。

到目前为止,我还没有在Google Apps脚本文档中找到有关此内容的参考。

目前我手动完成,但任何使用脚本的建议都会非常感激。

8 个答案:

答案 0 :(得分:13)

我不确定他们什么时候做的,但是他们现在已经添加了。

使用类class sideCollectionView:UIView, UICollectionViewDelegateFlowLayout,UICollectionViewDataSource { let arrayLbl = ["connection","achievement","template","setting"] let arrayImg = ["connection","achievement","template","setting"] func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return arrayLbl.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! sideCollectionViewCell cell.titleImg.image = UIImage(named: "\(arrayImg[indexPath.row])") cell.titleLbl.text = arrayLbl[indexPath.row] return cell } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (self.frame.width / 2) - 40, height: (self.frame.width / 2) - 40) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return UIEdgeInsetsMake(25, 25, 10, 25) } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if indexPath.row == 0{ connectController() print("connection") let side = sideViewController() side.bye() } if indexPath.row == 1{ let side = sideViewController() side.bye() print("achievement") } if indexPath.row == 2{ let side = sideViewController() side.bye() print("template") } if indexPath.row == 3{ let side = sideViewController() side.bye() print("setting") } } lazy var collectionViews: UICollectionView = { let layout = UICollectionViewFlowLayout() let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) cv.backgroundColor = UIColor.clear cv.dataSource = self cv.delegate = self return cv }() override init(frame: CGRect) { super.init(frame: frame) setupViews() } func setupViews(){ collectionViews.register(sideCollectionViewCell.self, forCellWithReuseIdentifier: "cell") collectionViews.translatesAutoresizingMaskIntoConstraints = false backgroundColor = UIColor.clear addSubview(collectionViews) collectionViews.topAnchor.constraint(equalTo: topAnchor, constant: 0).isActive = true collectionViews.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0).isActive = true collectionViews.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 0).isActive = true collectionViews.centerXAnchor.constraint(equalTo: centerXAnchor, constant: 0).isActive = true collectionViews.widthAnchor.constraint(equalTo: widthAnchor, constant: 0).isActive = true } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } @objc func connectController(){ let side = sideViewController() side.bye() } @objc func settingController(){ let side = sideViewController() side.bye() } @objc func achievementController(){ let side = sideViewController() side.bye() } @objc func templateController(){ let side = sideViewController() side.bye() } } 的{​​{3}}方法。示例:

DataValidationBuilder

答案 1 :(得分:9)

您要使用脚本在电子表格的单元格中创建复选框。如果我的理解是正确的,该解决方法如何?不幸的是,SpreadsheetApp类还没有用于创建复选框的方法。 (尝试使用这种方法时,会发生错误。)因此,我建议使用Sheets API创建它。

当我看到ConditionType中的dataValidation时,the document of BOOLEAN

  

单元格的值必须为TRUE / FALSE或在条件值列表中。由数据验证支持。 “渲染为单元格”复选框。 ...

由此,我可以理解如何使用Sheets API创建复选框。以下脚本是示例脚本。这将为“ A1:C3”创建6个复选框。使用此脚本时,请按以下说明在高级Google服务和API控制台上启用Sheets API。

在高级Google服务中启用Sheets API v4

  • 在脚本编辑器上
    • 资源->高级Google服务
    • 打开Goog​​le Sheets API v4

Enable Sheets API v4 at API console

  • 在脚本编辑器上
    • 资源-> Cloud Platform项目
    • View API控制台
    • 在“入门”中,单击“启用API”并获取凭据(例如密钥)。
    • 在左侧,单击库。
    • 在“搜索API和服务”中,输入“表格”。然后点击Google Sheets API。
    • 单击“启用”按钮。
    • 如果已启用API,请不要关闭。

如果现在要使用用于使用Sheets API的脚本打开脚本编辑器,则可以通过访问此URL https://console.cloud.google.com/apis/library/sheets.googleapis.com/

为项目启用Sheets API。

示例脚本:

在此示例脚本中,将复选框创建到Sheet1的“ A1:C3”。请将此脚本用作容器绑定脚本。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetId = ss.getSheetByName("Sheet1").getSheetId();
var resource = {"requests": [
  {
    "repeatCell": {
      "cell": {"dataValidation": {"condition": {"type": "BOOLEAN"}}},
      "range": {"sheetId": sheetId, "startRowIndex": 0, "endRowIndex": 3, "startColumnIndex": 0, "endColumnIndex": 3},
      "fields": "dataValidation"
    }
  },
  {
    "updateCells": {
      "rows": [
        {"values": [{"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": false}}, {"userEnteredValue": {"boolValue": false}}]},
        {"values": [{"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": false}}]},
        {"values": [{"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": true}}, {"userEnteredValue": {"boolValue": true}}]}
      ],
      "start": {"rowIndex": 0, "columnIndex": 0, "sheetId": sheetId},
      "fields": "userEnteredValue"
    }
  }
]};
Sheets.Spreadsheets.batchUpdate(resource, ss.getId());
流 :
  1. dataValidation使用repeatCell设置。
  2. boolValue使用updateCells设置。

结果:

enter image description here

注意:

  • 这是一个简单的示例脚本。因此,请根据您的环境进行修改。
  • 当可以使用Class SpreadsheetApp的创建复选框的方法时,我认为可以使用以下示例脚本。
类SpreadsheetApp的脚本

2018年6月22日,此脚本返回了服务器错误错误。

var rule = SpreadsheetApp.newDataValidation().withCriteria(SpreadsheetApp.DataValidationCriteria.CHECKBOX, ["TRUE", "FALSE"]).build();
SpreadsheetApp.getActiveSheet().getRange("A1").setDataValidation(rule);

参考文献:

如果我误解了你的问题,对不起。

答案 2 :(得分:4)

简短回答

添加Google表格用户界面中的复选框,然后使用其中一个copyTo 方法Class Range

解释

Google Apps脚本电子表格服务并未包含可通过Google表格用户界面完成所有操作的方法。这是插入>的情况。复选框这是一个非常新的功能。

即使是录制宏功能也无法做到这一点。以下是一个片刻前录制的

/** @OnlyCurrentDoc */

function InsertCheckbox() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A1').activate();
  /*
   * Added to show the missing Insert > Checkbox step
   */
  spreadsheet.getRange('B1').activate();
  spreadsheet.getRange('A1').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};

注意:如果您不想传递所有单元格属性(边框,公式,背景等,而不是SpreadsheetApp.CopyPasteType.PASTE_NORMAL,请使用SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION

Stack Overflow上的相关问题

答案 3 :(得分:3)

该复选框是最近添加的数据验证标准。有趣的是,当我尝试调用“getDataValidation()'包含复选框的范围上的方法,抛出以下错误:

var rule = range.getDataValidation();
  

很抱歉,发生了服务器错误。请稍等一下再试一次。

与此同时,您可以通过在工作表中的某个位置放置一个复选框并将其数据验证复制到新范围来解决此问题。例如,如果" A1"是包含复选框的单元格,目标范围由包含3行的单个列组成:

var range = sheet.getRange("A1"); //checkbox template cell
var targetRange = sheet.getRange(rowIdex, colIndex, numOfRows, numOfCols);
range.copyTo(col, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION);
var values = [["true"], ["false"], ["false"]];
targetRange.setValues(values);

答案 4 :(得分:2)

function onEdit() {
var cell = SpreadsheetApp.getActive().getRange('A1');
      var array =['☐','☑'];
    // var rule = SpreadsheetApp.newDataValidation().requireValueInList(['☐','☑']).build();
      var rule = SpreadsheetApp.newDataValidation().requireValueInList(array, false).build()
     cell.setDataValidation(rule);
     var valor = array[1];
     // Logger.log(valor);
      if(cell.getValue() == valor){
        cell.offset(0, 1).setValue("Aprobado");
      } else{
        cell.offset(0, 1).setValue("Reprobado");
      }
    }

答案 5 :(得分:2)

简单:

//There are two ways, using Range or using current cell or sheet or similar 
//First is using current cell
function VoF() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getCurrentCell().offset(1, 0, 499, 1).setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(true)
  .setHelpText('TRUE or FALSE')
  .requireCheckbox() //if you customize this is possible that you dont get the boxes and the verification data could fail,so keep them standar with TRUE and FALSE
  .build());
};

//Second is using Spreedsheet ranges

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('G1:G11').activate();
  spreadsheet.getRange('G1:G11').setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireCheckbox()
  .build());
};

答案 6 :(得分:0)

UPDATE(2019年4月)

您现在可以直接在RangeRangeListinsertCheckboxes(或removeCheckboxes),而无需任何变通方法。您还可以使用文档中提供的替代方法签名来更改检查值/未检查值。

摘要:

SpreadsheetApp.getActive()
    .getRange('Sheet2!A2:A10')
    .insertCheckboxes();

答案 7 :(得分:-1)

我同意您必须解决方法才能创建一个复选框。另一种方法可能是创建一个下拉列表。

function myFunction() {
 var cell = SpreadsheetApp.getActive().getRange('A1');
 var rule = SpreadsheetApp.newDataValidation().requireValueInList(['☐','☑']).build();
 cell.setDataValidation(rule);
}