How to add column above cell onedit sheets - javascript

I'm currently using google sheets script editor to add a date to cell A2 when the value of B2 is edited.
How can I add a new column above if the auto input of A2 is the 1st da of the month?
Please see Screenshot.
The following is what I have now.
function onEdit(e){
var active = e.range;
//ADD DATE
if(active.getA1Notation().substring(0,1) == 'B' && SpreadsheetApp.getActiveSheet().getName() !== 'Inventory'){
if(active.isBlank()){
active.offset(0, -1).setValue("");
}else{
active.offset(0, -1).setValue(Date());
}
}
Any guidance on where I can proceed on from here will be good. Got no clues at all if this is even possible.

Adding a row above edited cell if it's a 1 date of the month would lead to adding a row above every row added on the 1st day of the month, which is not the desired behaviour. You'll need to check the value in the previous row to determine if the row should be added. Use sheet.insertRowsBefore to add rows.
Here's sample code:
function onEdit(e) {
var value = e.range.getValue()
if (value == 'add') {
var rowNum = e.range.getRow()
SpreadsheetApp.getActiveSheet().insertRowsBefore(rowNum, 1)
SpreadsheetApp.getActiveSheet().getRange(rowNum,1).setValue('added row')
}
}

Related

How to post current time when checkbox = TRUE

I'll try to keep this short and sweet.
I am making a packaging form using Google Sheets. Users fill out the form using the dropdowns on the spreadsheet and press the Submit button to send the data to Packaging Form Responses. This script works perfectly. Now I'm struggling to write a script to make it so that the checkbox in cell O13 auto-populates the data in the "Time Out" section in row 13 with the current time. You'll notice that I have the current time broken down into different cells on row 24 (hh , mm , am/pm). Basically, when the checkbox is = TRUE, I want the data in row 24 to be posted in row 13's "Time Out" section (side note: rows 22-24 will be hidden when the form is live). Haven't used onEdit() function very much so I could use some help here.
Here is my code thus far:
function onEdit(e) {
var range = e.range;
var spreadSheet = e.source;
var column = range.getColumn;
var row = range.getRow;
var hours = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Packaging Form').getRange('H24').getValue();
var minutes = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Packaging Form').getRange('I24').getValue();
var ampm = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Packaging Form').getRange('J24').getValue();
if(column == 15 && row == 13){
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Packaging Form').getRange('D13').setValue(hours);
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Packaging Form').getRange('F13').setValue(minutes);
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Packaging Form').getRange('H13').setValue(ampm)
}
}
Not sure what is wrong here, I believe it has to do with my local variables hours, minutes, and ampm.
Also I haven't gotten this far yet, but would like for the current time that gets posted in row 13 to be cleared when the checkbox no longer = TRUE (i.e. when the user un-checks the "Use current time" checkbox, the data in the "Time Out" section is cleared). Any help would be greatly appreciated, thank you.
Replace
var column = range.getColumn;
var row = range.getRow;
by
var column = range.getColumn();
var row = range.getRow();
or even better
var column = range.columnStart;
var row = range.rowStart;
P.S. you might also change SpreadsheetApp.getActiveSpreadsheet() by spreadsheet.

Copy data from one spreadsheet to another on edit

I already try everthing but I cant make this work =/
I'm trying to copy data from one spreadsheet to other using setValues(), because link doesn't work for me. I also need to keep the trigger on edit.
So, I create one fuction called AddConvocacao, and always when have any change the script run.
function addConvocacao(e){
var linha = e.range.getRow(); //get the number of the line, where have edit
var nome = e.source.getActiveSheet().getRange(linha,2).getValue(); //get the value of the field
var targetSheet = SpreadsheetApp.openById('1iQbZ7iB9ddc-HwLK9vG0eVEeWWqXKJZ0ry7U_Hm4SkQ') //open the other spreedsheet
var targetName = targetSheet.getSheetByName('Pac'); //open the tab
var lastRow = targetName.getLastRow(); //count the last row in this tab
lastRow = lastRow+1; //add 1
targetName.getRange(lastRow, 2).setValue(nome); // set the value
// targetName.getRange(lastRow, 3).setValue(valorCol7);
// targetName.getRange(lastRow, 5).setValue(dose);
// targetName.getRange(lastRow, 6).setValue(diagnostico);
// targetName.getRange(lastRow, 7).setValue(medico);
}
why dosen't work when I use on edit?
Thanks so much! =)
I did it a little different I think. I put checkboxes in column one and capture the value from column 2 and sent it to the other spreadsheet to the bottom of column 2
function onMyEdit(e) {
//e.source.toast('entry');
const sh = e.range.getSheet();
//Logger.log(JSON.stringify(e));
if (sh.getName() == 'Sheet1' && e.range.columnStart==1 && e.value=="TRUE") {
//e.source.toast('cond');
const v = sh.getRange(e.range.rowStart, 2).getValue();
var tss = SpreadsheetApp.openById(getGlobal('targetid'));
var tsh = tss.getSheetByName('Sheet1');
tsh.getRange(tsh.getLastRow() + 1, 2).setValue(v);
e.range.setValue("FALSE");
}
}
You must use an installable trigger to us openById();
getGlobal(targetid) just gets a spreadsheet id you can replace that with the id
Also I limited the action to only one sheet and only when I set the checkbox to true. I reset it back to false in the code.
You'll need to modify a few things to get it to work for you because when I'm doing the examples I do it my way.

Hide Rows Based on Content of a Cell - Google Spreadsheet

I want to create a way to hide a certain number of rows if there is a certain value in a cell of a Google spreadsheet.
E.g.
A B
1 Include All options`? Yes/No
2 Option A: Yes/No
3 Option B: Yes/no
etc.
If cell B1 is "yes" there is no need to look at all other options. However, if they select "No", there needs to be an option for selecting the Option "Yes/No". For this reason, I would like to hide the rows when option = yes but unhide them if it is No
This code detects whether a certain cell (B3) was edited, then hides a couple of rows under that row (row 3) if it was edited:
function onEdit(e) {
Logger.log('e.value: ' + e.value);
var cellEdited = e.range.getA1Notation();
Logger.log('cellEdited: ' + cellEdited);
if (cellEdited === "B3") {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var theSheet = ss.getActiveSheet();
theSheet.hideRows(4, 2);
};
}
This code uses a function name of onEdit(), which means that it monitors the spreadsheet for edits to a cell. If there is an edit, the function runs. This is a "simple" trigger. There are also installable triggers for monitoring the spreadsheet.
Note the Logger.log() statements. These statement print information to the LOGS which you can VIEW from the VIEW, LOGS menu.
For your purposes:
function onEdit(e) {
Logger.log('e.value: ' + e.value);
var cellEdited = e.range.getA1Notation();
Logger.log('cellEdited: ' + cellEdited);
if (cellEdited === "B1" && e.value === "yes") {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var theSheet = ss.getActiveSheet();
theSheet.hideRows(2, 2);
};
}

Google Sheets Script : Automatically remove a row into another sheet

I am currently using google forms to enable users to submit site changes. This is all working beautifully.
I have added an extra column that has ticket status. Now I have written a script that checks for when this is updated to Done and then moves that row into another sheet entitled done.
However this only works if i update a row that i manually added. If I change the column on a row created from the form entry it will not work. Has anyone seen this issue before. Code is below.
function onEdit(e){
/*
When a user updates a status to done the ticket gets moved to another sheet
*/
var sheetNameToWatch = "Form responses 1"; // The sheet to watch for changes
var columnNumberToWatch = 1; // The column where the change happens on the above sheet
var valueToWatch = "Done"; // What is the text you are looking for
var sheetNameToMoveTheRowTo = "Done"; // The Sheet name for where the row gets moved to.
var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get the active spreadsheet
var sheet = SpreadsheetApp.getActiveSheet(); // Get the active sheet
var range = sheet.getActiveCell(); // Get the current cell that has just been updated
// Check that you are on the correct sheet and column.
if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo); // get a reference for the target sheet
var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); // get a reference for the target row
sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange); // copy the row from current sheet to the new sheet
sheet.deleteRow(range.getRow()); // Delete the row from the old sheet
}
}
Yep, the onEdit function won't fire unless you do it manually, you'll want to use the onFormSubmit trigger, which will fire when a form response is received. This is a manually installed trigger connected to your form, which should be able to do the function above pretty much as written.
var form = FormApp.openById('1234567890abcdefghijklmnopqrstuvwxyz');
ScriptApp.newTrigger('myFunction')
.forForm(form)
.onFormSubmit()
.create();
To be safe, though, you may want to define your spreadsheet, sheet, and range by id or by name rather than by whether they are active, I believe getActiveWhatever() kinds of methods will return null if the spreadsheet isn't open.
As mentioned, using active is not the best idea.
Instead of:
var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get the active spreadsheet
var sheet = SpreadsheetApp.getActiveSheet(); // Get the active sheet
var range = sheet.getActiveCell(); // Get the current cell that has just been updated
Try:
var range = e.range;
var sheet = range.getSheet();
var ss = sheet.getParent();
If you try this you cannot execute it from the code editor because no event is passed. You must execute it by actually submitting a form.

Copy Rows from a Sheet to another sheet based on Criteria

I am using Gdocs spreadsheet for jobs queue.
I would like to know how a row and all its content (from column A:AS) can be moved from "Live WIP Jobs" (sheet1) Tab to "Delivered Jobs" (Sheet2) Tab by marking it as "Delivered" in Column "AP".
Normally it will be marked as WIP in sheet1.
On marking it as Delivered, I would like the row to copied to the Sheet2 and get it removed from sheet1.
Attaching sheet for reference
https://docs.google.com/spreadsheets/d/1gZYni8SGUa4Ohu3BIOxJh2bQSUqQh_5Q3epDidP574E/edit#gid=1557156093
I also tried the below script.. but it wasn't working and fetching error:
function CopyRowsOnConditions() {
// assumes source data in sheet named Live WIP Jobs
// target sheet of move to named Delivered
// test column with Delivered/WIP is col AP or 42
var sheet = SpreadsheetApp.getActiveSheet();
var numRows = sheet.getDataRange().getNumRows();
var source = sheet.getRange(2, 42, numRows);
if(s.getName() == "Live WIP Jobs" && r.getColumn() == 42 && r.getValue() == "Delivered"){
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Delivered");
if(targetSheet.getLastRow() == targetSheet.getMaxRows()) {
targetSheet.insertRowsAfter(targetSheet.getLastRow(), 20); //inserts 20 rows after last used row
}
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
Checking the code in the script (the one you posted was not complete) i noticed that you are creating the variables "r" and "s" using the variable "event".
When you have a event (eg. onEdit) the function receives a parameter event, then you can us it. here is information in those events https://developers.google.com/apps-script/guides/triggers/events
If you are going to use an event, change the code accordingly, as mention in the documentation.

Categories