I am learning to use google app script. I have written code to get row number in which so far I succeeded but can't find a way to assign it to a cell or row change event trigger. Can someone help me figure out how to do this?
My code is as follows :
function onChange(event) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var currentCell = sheet.getCurrentCell();
sheet.getRange("B1").setValue(currentCell.getRow());
}
There are no "onSelect" trigger on Google Apps Script but you could use the poll technique. Basically, you will have to use a sidebar to hold client-side code that will check for the selected cell every determined time. For code examples checkout the following Q/A
How do I make a Sidebar display values from cells?
How to detect user changing sheet?
Have you installed the trigger? onChange triggers need to be explicitly hooked up because they're considered installable triggers (opposed to simple triggers, which just require saving the .gs file).
You can manage your triggers from the Menu in your Apps Script Editor:
Related
I have a problem with triggers in Google App Script. I have a spreadsheet holding my users and other stuff (appSheet), and I have a second spreadsheet that holds all the data (dataSheet).
I also built a script that imports some data from "appSheet" to "dataSheet", and it works pretty well. The problem is I need it to execute automatically when a new row (user) is added in the app sheet. The built-in triggers in Google App Script doesn't allow me to set that kind of trigger.
I set this importing function in the dataSheet, maybe should I set it in the appSheet ? It may seem super easy but I'm a newbie to this :)
Has someone an insight on how to automatically trigger that function ?
Thanks a lot !
Thanks guys for your answers !
I found a very simple way to achieve this.
Instead of setting the script on the dataSheet and having the need of an "onEdit" trigger, I put the script in the appSheet and did little modifications.
The script is as followed :
function exportData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var values = ss.getSheetByName('mySourceSheet').getRange('A2:B').getValues();
var dataSheet = SpreadsheetApp.openById("myDestinationSpreadsheet");
var targetSheet = dataSheet.getSheetByName("myDestinationSheet");
targetSheet.getRange(2,1,values.length,values[0].length).setValues(values);
}
The "2" in the "targetSheet.getRange" meaning I want it to begin in row 2.
Everything runs perfectly now with the built-in triggers in Apps Script.
I have a custom function that auto updates when a change is made on the google spreadsheet, but when some other users edits the sheet the function doesn't work for them, how can i make it update for anyone that uses the sheet.
The function auto updates using this:
function onEdit(e) {
SpreadsheetApp.getActiveSheet().getRange('Z1').setValue(Math.random());
}
Then passing the parameter of Z1.
Explanation:
Just a couple of notes to make sure we are on the same page.
This is not a custom function but an onEdit trigger function.
As the name suggests it is triggered when user changes the value of any cell in a spreadsheet.
The function is only triggered when the change of the cell is made by a user and not by formulas or scripts.
Potential Issues:
Make sure the other users have edit permissions on the target cell. If they are not allowed to edit cell Z1 in the activeSheet which might be any sheet in the spreadsheet file, then the script won't work for them. You can either give them access, or make the script work only under particular sheets when you can give them access.
Some users sometimes have experienced issues when tried to chain with active methods directly. See reference links here and here although I can't reproduce that issue, it might be the cause in your case.
Potential Solution:
Please take care of the first issue.
Regarding the second issue, modify your code as follows:
function onEdit(e) {
const active_sheet = e.range.getSheet();
active_sheet.getRange('Z1').setValue(Math.random());
}
This is anyway the recommended way to use an onEdit trigger as you should take advantage of the event object.
Essentially I want to use a bound script in a Google Form to call a function in a Google Sheet that will go and edit yet another sheet. Ideally I could eliminate those steps if the onEdit trigger in the data sheet would get called when a new form submission happens, but that isn't working so now we're here. I really just need the syntax to know how to trigger a bound function in the Sheet's script by running the onFormSubmission trigger that is bound to a Google Form.
I haven't really tried much, I think all I need is to be told that it is impossible, OR HOPEFULLY just to see what the proper syntax is. I'm new to Google Apps Script, I think I'm like 2 hours in or so.
function onFormSubmit() {
//call the populateJournal() function that is bound to the Sheet
}
After I get this done I'm gonna need to have the populateJournal() function edit a sheet that is another container entirely, and I'm guessing that syntax is gonna look marginally similar in terms of referencing an external container. Any help would be greatly appreciated, my apologies for my ineptitude.
If you are able to send the form responses to the spreadsheet by using the built-in feature for that, instead of using the on form submit event of the bounded to form script uses the on form submit event of the bounded to spreadsheet script.
I'm working on a scoreboard automation process using Google Sheets, but I've come up with a little problem. I tried searching here but the question has been treated in a unclear way to me.
What am I trying to do is quite simple:
I want an automatic e-mail to be sent to a specific person IF cell value > X (threshold). I already know I need to use Google Apps Script for that, but I haven't found much interesting code lying around yet so I was wondering if you guys had an idea how that would work?
I tried something based on this thread with no success: How do I make a Google Sheet script send an email when a specific cell's value changes?
#Yvan1401,
You can use a script like this along with an installable trigger like onEdit or onChange to accomplish what you wish. To set up the installable trigger follow the steps below (found here):
From the script editor, choose Resources > Current project's
triggers.
Click the link that says: No triggers set up. Click here to add one
now.
Under Run, select the name of function you want to trigger. Under
Events, select From spreadsheet.
Select and configure the type of trigger you want to create (e.g. on
Change or on Edit trigger).
Optionally, click Notifications to configure how and when you will
be contacted by email if your triggered function fails.
Click Save.
Please see comments in code for portions to change.
function SendEmail() {
var ui = SpreadsheetApp.getUi();
var file = SpreadsheetApp.getActive();
var sheet = file.getSheetByName("Sheet1"); //Change as needed
if(sheet.getRange(5,1).getValue()>10){ //change row and column in get range to match what you need
MailApp.sendEmail("xxxxxcxxx#gmail.com", "subject", "message");
}
}
function sendMail() {
if (SpreadsheetApp.getActive().getSheetByName('Scoreboard').getRange('AL2:AL1000').getValue()<2.70) return;
MailApp.sendEmail("yvan#********.com", "******** new potential candidate available ! ", "Dear ****, a new candidate with strong potential is available for due dil !", {
name: "SOURCE NAME"
});
}
Here is an example of code that works the best and is the shortest. The thing is, I want it to scan only the cells that has changed (updated) within the column in question and not the old responses (data source is a form). What do you think i should do ? Because i don't want to erase the previous response within the same column.
edit: I use an "onChange" trigger.
I'm using this code to use data in a Google Apps Script:
function getCurrentRow() {
var currentRow = SpreadsheetApp.getActiveSheet().getActiveSelection().getRowIndex();
return currentRow;
}
But when I use other sheet than the first one (number "gid=0"), my function remains getting data from that first sheet and not from my current active sheet. Since I'm using the method .getActiveSheet() how can I fix that?
PS - I'm not calling the code from a cell. I'm using this code:
http://opensourcehacker.com/2013/01/21/script-for-generating-google-documents-from-google-spreadsheet-data-source/
I created from scratch a brand new spreadsheet, within which, I created a few tabs/sheets with some data within each; and then in google apps script in that spreadsheet I installed the following code:
function getCurrentRow() {
var currentSelection = SpreadsheetApp.getActiveSheet().getActiveSelection()
var currentValue = currentSelection.getValue();
var currentRow = currentSelection.getRowIndex();
Logger.log(currentValue);
Logger.log(currentRow);
return currentRow;
}
I ran the script, and it gave me the correct results for the sheet that was open/which cell was selected. So I would say that this code pretty much works as you expect.
In your case, may I suggest that the quickest way to get more info about the error, or to see if the error persists, is for you start from scratch too, with a new spreadsheet, and paste in the code above, and then test to prove that at least that much works for you too. Then, only after this, paste in the greater code (that you have linked to), and see if it still/stops working.
I'm having the same problem while developing in the Script Editor -- the Script Editor instance/window becomes 'disconnected' from the Sheets instance/window and just has the first sheet / A1 etc as the 'actives'.
What worked for me:
Closing the Script Editor window and re-opening from Sheet > Tools > Script editor. Voila, .getActive...()s are working again.
Also:
As implied by some of the other answers, triggering the execution from the Sheets window/instance (probably always) also works. One of the answers calls a function from a cell, which means it's going to be triggered by the Sheet. Another option would be to add a .UI menu and menu-option and trigger it there.
Do you use your function as a formula?
Maybe I'm not understanding well the case, but using your code as a formula, it works as expected.
In Sheet1 (Active) apply the formula:
Then manually change the Sheet2 (Active) and apply the formula again:
Its because you are calling it from a custom function in a cell. You cant do that because custom functions must be deterministic. The answer from wchiquito works because he is using a different cell to try the 2nd case. If you use the same cell it will show the old cached result. Search s.o. for the issues about dedeterministic functions. Ive provided workarrounds in those (basically pass a second param =now()
create a spreadsheet in google drive and save it.
In the spreadsheet go to tools menu and script editor
and type the function.