0

私はこの形式のスプレッドシートを持っています

 A
ABC
DEF
GHI
FOO
BAR
BAZ
ABC

もちろん、テーブルははるかに長いです。

より多くの値を挿入したいのですが、最初にそれらの一意性を検証したいと考えています。つまり、テーブルに既に存在する値を挿入するたびに、スプレッドシートに通知してもらいたいのです。

また、フォーム ウィンドウからスプレッドシートにデータを挿入して、一意でない値を挿入しようとしているときにデータを挿入しない方法があるかどうかも疑問に思っていました。

前もって感謝します

4

2 に答える 2

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 ドライブにインストールする必要があります。

Google サイト - Google フォーム

フォームが送信されたときにいくつかのコードを実行する方法があります。フォームが送信されたときに、スプレッドシートまたはスプレッドシートに添付されたフォームからイベントを実行できます。

Apps Script コード エディタで [リソース] メニューを開き、フォームが送信されたときに関数を実行するトリガーを追加します。

于 2014-10-01T14:59:28.113 に答える
0

より多くの値を挿入したいのですが、最初にそれらの一意性を検証したいと考えています。つまり、テーブルに既に存在する値を挿入するたびに、スプレッドシートに通知してもらいたいのです。

値をシートに直接入力していて、セル内のデータの入力/編集時に一意性チェックを実行したい場合は、次の 2 つの方法があります。

  1. データ検証の使用

    一意の値が必要な列が列 A の場合、ヘッダーをクリックして列全体を選択し、メニュー [データ] - > [検証... ] を選択し、 [基準] で [カスタム式は] オプションを選択して、次の式を入力します。

    =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 に答える