0

我有这种形式的电子表格

 A
ABC
DEF
GHI
FOO
BAR
BAZ
ABC

当然,桌子要长得多。

我想插入更多值,但我想首先验证它们的唯一性。换句话说,每当我插入表中已经存在的值时,我都希望电子表格通知我。

我还想知道是否有一种方法可以从表单窗口将数据插入电子表格,当我尝试插入非唯一值时,它会通知并且不会插入我的数据。

提前致谢

4

2 回答 2

0

我想插入更多值,但我想首先验证它们的唯一性。换句话说,每当我插入表中已经存在的值时,我都希望电子表格通知我。

如果您的意思是直接在工作表中输入值并希望对单元格中数据的输入/编辑执行唯一性检查,您有两种方法可以做到:

  1. 使用数据验证

    如果您希望具有唯一值的列是 A 列,则通过单击其标题来选择整个列,选择菜单Data->Validation...,然后在Criteria下选择“Custom formula is”选项并输入以下公式:

    =IF(ROW(A1)=1, ISNA(MATCH(A1, $A$2:$A, 0)), IF(ROW(A1)=ROWS($A:$A), ISNA(MATCH(A1, INDIRECT("$A$1:$A$"&(ROWS($A:$A)-1)), 0)), AND(ISNA(MATCH(A1, INDIRECT("$A$1:$A$"&(ROW(A1)-1)), 0)), ISNA(MATCH(A1, INDIRECT("$A$"&(ROW(A1)+1)&":$A"), 0)))))
    

    这将根据 A 列中的所有其他值检查您输入的值,以确保它是唯一的。现有的非唯一单元格将在其中插入一条注释,通知您该值是非唯一的。如果您的唯一列不是 A 列,请相应地编辑公式。

  2. 使用 onEdit() 触发器。您可以将 onEdit() 触发器添加到您的工作表中,如下所示,它将检查已编辑的单元格,如果已编辑的值对于该列不是唯一的,则会提醒您,然后将其删除。[ 2014 年 10 月 5 日更新:代码已被重新​​编写,可以正确处理粘贴的值,甚至是多列粘贴。将变量值更改columnToCheck为要监控的列的唯一性。有关详细信息,请参阅代码中的注释。]

    function onEdit(e) {
      var r = e.range; // reference to edited range of cells
      var columnToCheck = 2; // which column should be monitored for uniqueness? 1=A, 2=B, ... Change as necessary.
      var isMultiColRange = (r.getNumColumns()>1); // check if edited range has single column or multiple columns
      if (isMultiColRange) {
        // if range has multiple columns, check that it includes our monitored column
        var monitoredColumnIsInRange = 0;
        for ( var i=1; i<=r.getNumColumns(); ++i) {
          if (r.getCell(1, i).getColumn()==columnToCheck) {
            monitoredColumnIsInRange = i;
            break;
          }
        }
      }
      else {
        // if edited range is single column, check that that is the monitored column
        var monitoredColumnIsInRange = (r.getColumn()==columnToCheck) ? 1 : 0;
      }
      if (monitoredColumnIsInRange) { // only proceed if monitored column was edited
        var monitoredColValues = r.getValues().map(function(el){return el[monitoredColumnIsInRange-1];}); // store edited/pasted values of monitored column in array
        if (monitoredColValues.join("")!="") { // only proceed if non-blank values were entered
          var ss = SpreadsheetApp.getActiveSheet(),
              numRows = ss.getMaxRows(),
              rangeFirstRow = r.getRow(), 
              rangeLastRow = rangeFirstRow+r.getNumRows()-1;
          var values; // will hold an array of current monitored column values
          // get all values in monitored column except currently edited cell's value
          if ( rangeFirstRow==1 ) { // data was entered/edited/pasted into first row in monitored column
            values = ss.getRange(rangeLastRow+1, columnToCheck, numRows-rangeLastRow).getValues();
          }
          else if (rangeLastRow==numRows) { // data was entered/edited/pasted into the last cell in monitored column
            values = ss.getRange(1, columnToCheck, numRows-r.getNumRows()).getValues();
          }
          else { // data was entered/edited/pasted into some other cell in monitored column
            values = ss.getRange(1, columnToCheck, rangeFirstRow-1).getValues().concat(ss.getRange(rangeLastRow+1, columnToCheck, numRows-rangeLastRow).getValues());
          }
          values = values.join().split(","); // convert current values of monitored column into a 1-D array
          var arrDuplicates = []; // will hold non-unique edited/pasted values for alert prompt
          // loop over edited/pasted values and check each for uniqueness
          for ( var j=0, lenEditedValues=monitoredColValues.length; j<lenEditedValues; j++ ) {
            var val = monitoredColValues[j].toString(); // need .toString(), otherwise numbers become decimal values, which 
            if ( values.indexOf(val)>-1 ) { // this value is NOT unique
              arrDuplicates.push(val); // save it in arrDuplicates for reporting
              r.getCell(j+1, monitoredColumnIsInRange).clear(); // clear the cell value
            }
            else { // this value is unique => add it to values array so that it is used in further uniqueness checks (to prevent pasting multiple same values) 
              values.push(val);
            }
          }
          if ( arrDuplicates.length ) {
            SpreadsheetApp.getUi().alert("You entered "+arrDuplicates.length+" values ("+arrDuplicates.join(', ')+") that are NOT unique to the column.\nThese values will be removed.");
          }
        }
      }
    };
    

以上是一个例子——适应你自己的需要。

我还想知道是否有一种方法可以从表单窗口将数据插入电子表格,当我尝试插入非唯一值时,它会通知并且不会插入我的数据。

这绝对是可能的。您可以使用 HTMLService 创建和发布 web 应用程序,例如,使用 HTML 表单允许您输入数据、检查其唯一性,如果一切正常,则将其插入到电子表格中,或者如果数据不唯一则显示错误. Sandy Good 在他的回答中给了你一些起点。

于 2014-10-01T16:37:43.660 回答
0

如果您将数据作为数组返回,则可以使用 JavaScriptindexOf()方法检查现有值。

  • 从电子表格中获取数据
  • 使用要写入的值检查现有值
  • 如果存在价值,请通知您。

获取数据

Google 文档 - 获取值

// The code below will get the values for the range C2:G8
// in the active spreadsheet.  Note that this will be a javascript array.
var values = SpreadsheetApp.getActiveSheet().getRange(2, 3, 6, 4).getValues();
Logger.log(values[0][0]);

检查重复:

var returnFromIndexOf = values.indexOf(valueToChk);

通知你:

if (values.indexOf(valueToChk) != -1) {
  //Send me an email
// Send an email with two attachments: a file from Google Drive (as a PDF) and an HTML file.
 var file = DriveApp.getFileById('1234567890abcdefghijklmnopqrstuvwxyz');
 var blob = Utilities.newBlob('Insert any HTML content here', 'text/html', 'my_document.html');
 MailApp.sendEmail('mike@example.com', 'Attachment example', 'Two files are attached.', {
     name: 'Automatic Emailer Script',
     attachments: [file.getAs(MimeType.PDF), blob]
 });
};

Google 文档 - 发送电子邮件

您需要将 Google 表单安装到您的 Google 云端硬盘才能创建新表单。

谷歌网站 - 谷歌表单

提交表单时有一些方法可以运行一些代码。您可以在提交表单时从电子表格或附加到电子表格的表单中运行事件。

在 Apps 脚本代码编辑器中,打开资源菜单并添加触发器以在提交表单时运行函数。

于 2014-10-01T14:59:28.113 回答