Hello,
I've found this script (below) on the internet. It's for google sheet.

*what it does?*
when I input a value in a cell, script copy the value to a helper sheet.
so, if I or other user tried to delete or change the value, it returns to 
previous value, it won't let you change the value.

*what is the problem? what I want?*
*1. *The script creates a helper sheet, so, if other user change the value 
from helper sheet it also changes in main sheet. I don't want that. I tried 
to lock the helper sheet, then the script won't copy any value from main 
sheet to helper sheet. I want to lock the helper sheet only editable by me, 
and also other users value copied to helper sheet.

*2. *If I or other user copied bunch of cells and paste to main sheet, 
script copy only the first cell to the helper sheet, so except first cell 
other cells remain editable.

Hope I've explained properly. Please someone help me on this. Help will be 
appreciated.
Thanks


*Script:*

function onEdit() {
  // Re: 
https://productforums.google.com/d/topic/docs/gnrD6_XtZT0/discussion
  //
  // This script prevents cells from being updated. When a user edits a 
cell on any sheet,
  // it is checked against the same cell on a helper sheet, and:
  //
  //   - if the value on the helper sheet is empty, the new value is stored 
on both sheets
  //   - if the value on the helper sheet is not empty, it is copied back 
to the cell on
  //     the source sheet, undoing the change
  //
  // This in effect protects sheets in a "write once" manner, albeit with 
lots of limitations.
  // The script does *not* provide protection against edits by a determined 
user.
  // For example, selecting all cells and pressing Delete lets any user 
erase many cells at once.
  // The values that were deleted from the cells will however be preserved 
on the helper sheet
  // and will reappear when an individual cell is edited again.
  //
  // Helper sheets are created automatically when an edit is first made, 
one helper sheet
  // per source sheet. For a source sheet named "Sheet1", the helper sheet 
is "Sheet1_helper".
  // Helper sheets are automatically hidden when created to not clutter the 
display, but
  // they can be uhidden by any user with "can edit" rights to the 
spreadsheet.
  // Users with edit rights can also disable this script at will.
  //
  // To change a value that was entered previously, empty the corresponding 
cell on the helper sheet,
  // then edit the cell on the source sheet.
  // When you rename a source sheet, remember to rename the helper sheet as 
well.
  // Choose "View > Hidden sheets" to show the helper sheet, then rename it 
using the pop-up
  // menu at the sheet's tab at the tab bar at bottom of the browser window.
  //
  // To take this script into use:
  //
  //  - take a backup of your spreadsheet through File > Make a copy
  //  - select all the text in this script, starting at the "function 
onEdit()" line and ending at the last "}"
  //  - copy the script to the clipboard with Control+C
  //  - open the spreadsheet where you want to use the function
  //  - choose Tools > Script editor > Blank (this opens a new tab in the 
browser)
  //  - press Control+A followed by Control+V to paste the script in
  //  - press Control+S to save the script
  //  - close the script editor tab and go back to the spreadsheet tab
  //
  // The script will from then on watch updates on all the sheets and only 
allow edits
  // when the cell is empty to start with.
  // 
  // Note that the script only protects _values_ rather than _formulas_.
  // To protect formulas, use Data > Named and protected ranges.
  //  
  // If your sheets that you would like to protect already have data on 
them, create helper
  // sheets manually by choosing the Duplicate command from the sheet's tab 
menu at the tab bar
  // at the bottom of the browser window. Rename the new sheet so that 
"Copy of Sheet1" becomes
  // "Sheet1_helper".
  //
  // The range where edits are of this "write once" type can be limited by 
changing the values
  // assigned to the firstDataRow, lastDataRow, firstDataColumn and 
lastDataColumn variables below.
  // The range defined by these values is global and will apply to all the 
sheets the same.
  //
  // You can exclude some sheets from being watched by putting them on the 
freeToEditSheetNames
  // list. See below for more info.
  
  
  // modify these variables per your requirements
  
  // define the range where edits are "write once"
  // to watch only the range A1:D100, define rows as 1,100 and columns as 
1,4
  // to watch only the range M20:V30, define rows as 20,30 and columns as 
13,22
  var firstDataRow = 1; // only take into account edits on or below this row
  var lastDataRow = 999; // only take into account edits on or above this 
row
  var firstDataColumn = 1; // only take into account edits on or to the 
right of this column
  var lastDataColumn = 999; // only take into account edits on or to the 
left of this column
  
  // naming pattern for sheets where values are copied for later checking
  var helperSheetNameSuffix = "_helper";
  
  // sheets that are free to edit with no protection
  var freeToEditSheetNames = ["Free to edit 1", "Free to edit 2", 
"Cash_Note", helperSheetNameSuffix + "$"];
  // You can use regular expressions in sheet names. The match is not 
case-sensitive,
  // so "free.*edit" will match "free to edit", "Free Editing for 
Everyone", 
  // "Sheet (free to edit)" and "Free edit playground".
  // Leave the last entry, helperSheetNameSuffix + "$", as it is to ensure 
that changes to a
  // helper sheet do not trigger the creation of another _helper_helper 
sheet.
  // See these sites for more info:
  //   - http://en.wikipedia.org/wiki/Regular_expression
  //   - 
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
  
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var masterSheet = ss.getActiveSheet();
  var masterSheetName = masterSheet.getName();
  var masterCell = masterSheet.getActiveCell();
  var sheetNameRegExp;
  
  // do not record edits on free to edit sheets
  for (var sheet in freeToEditSheetNames) {
    sheetNameRegExp = new RegExp(freeToEditSheetNames[sheet], "i");
    if (sheetNameRegExp.test(masterSheetName)) return;
  }
  
  // find helper sheet
  var helperSheetName = masterSheetName + helperSheetNameSuffix;
  var helperSheet = ss.getSheetByName(helperSheetName);
  if (helperSheet == null) { // helper sheet does not exist yet, create it 
as the last sheet in the spreadsheet
    helperSheet = ss.insertSheet(helperSheetName, ss.getNumSheets());
    Utilities.sleep(2000); // give time for the new sheet to render before 
going back
    ss.setActiveSheet(masterSheet);
    helperSheet.hideSheet();
    ss.setActiveRange(masterCell);
  }
  
  if (masterCell.getRow() < firstDataRow || masterCell.getColumn() < 
firstDataColumn || 
    masterCell.getRow() > lastDataRow || masterCell.getColumn() > 
lastDataColumn) return;
  
  var helperCell = helperSheet.getRange(masterCell.getA1Notation());
  var newValue = masterCell.getValue();
  var oldValue = helperCell.getValue();
  
  if (oldValue == "") {
    helperCell.setValue(newValue);
  } else {
    masterCell.setValue(oldValue);
  }
}

-- 
You received this message because you are subscribed to the Google Groups 
"Google Spreadsheets API" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-spreadsheets-api/58277a54-8745-4f30-ad53-2f084314d479%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to