Is there a i.height parameter in appscript? - google-apps-script

i tried to find any info on it, i want to use height of the row in a cycle, i know that there is i.length, but is it one for height?
example with length:
for (var i = 2; i <= data.length+1; ++i)
i want it to look something like:
for (var g = 1; g<=grupa.height+1;g++)
this is my whole code, if you want for some reason to look at it:
function myFunction()
{
const ss = SpreadsheetApp.openByUrl ('my url');
var sheet = ss.getSheetByName("Розклад")
var data = sheet.getRange(2, 1, sheet.getLastRow()-1 , sheet.getLastColumn()).getValues();
Logger.log(data);
for (var i = 2; i <= data.length+1; ++i)
{
var data1 = sheet.getRange(i,1,1,13).getValues()
var data2 = sheet.getRange(i,8,1,13).getValues()
var grupas = data [i-2][4]
var cell= data [i-2][8]
var grupa = ss.getSheetByName(grupas)
var grupav = grupa.getRange(1,1,grupa.getLastRow(), grupa.getLastColumn()).getValues();
for (var g = 1; g<=grupa.height+1;g++)
{
var grupap = grupa[0][g-1]
Logger.log(grupap)
}
Logger.log(grupas)
Logger.log(grupav)
Logger.log(cell)
Logger.log(data1);
if ( cell ==="")
{
Logger.log('blank cell');
}
else
{
Logger.log(data2)
}
Logger.log(i-1);
}
}

var grupa = ss.getSheetByName(grupas)
var grupav = grupa.getRange(1,1,grupa.getLastRow(), grupa.getLastColumn()).getValues();
for (var j = 0; j < grupav.length; j++) {
/* grupav[j][0] */
}
Row loop
const col = 0;
const values = sheet.getDataRange().getValues();
for (const i = 0; i < values.length; i++) {
/* values[i][col] */
}
Column loop
const row = 0;
const values = sheet.getDataRange().getValues();
for (const j = 0; j < values[0].length; j++) {
/* values[row][j] */
}
Row & Column loop
const values = sheet.getDataRange().getValues();
for (const i = 0; i < values.length; i++) {
for (const j = 0; j < values[0].length; j++) {
/* values[i][j] */
}
}

Related

Exception: The number of rows in the data does not match the number of rows in the range. The data has 1 but the range has 8. Google Script

I am having troubles in
Exception: The number of rows in the data does not match the number of rows in the range. The data has 1 but the range has 8. Google Script
function myFunction() {
var s1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Staging');
var s2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Final');
var values1 = s1.getDataRange().getValues();
var values2 = s2.getDataRange().getValues();
var Avals = s2.getRange("A1:A").getValues();
var Alast = Avals.filter(String).length;
var resultArray = [];
for(var n=0; n < values1.length ; n++)
{
var keep = false;
var counter = 0;
for(var p=0; p < values2.length ; p++)
{
if( values1[n][1] == values2[p][1])
{
keep = true;
break ;
}
}
if(keep == false)
{
resultArray.push([values1[n]]);
//s2.appendRow( values1[n] );
s2.getRange(Alast + 1, 1, values1[n].length, values1[n].length).setValues([values1[n]]);
//s2.getRange(s2.getLastRow() + 1, 1, values1.length, values1[0].length).appendRow( values1[n] );
resultArray = [];
keep = false
}
}
}
I believe you are trying to keep appending a new row to the end of the data on "Final". You should revise you script as shown below. Use resultArray to collect all new rows and save it to spreadsheet once.
function myFunction() {
var s1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Staging');
var s2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Final');
var values1 = s1.getDataRange().getValues();
var values2 = s2.getDataRange().getValues();
// s2.getDataRange() will get up to the last row of data
var Alast = values2.length;
var resultArray = [];
for(var n=0; n < values1.length ; n++)
{
var keep = false;
var counter = 0;
for(var p=0; p < values2.length ; p++)
{
if( values1[n][1] == values2[p][1])
{
keep = true;
break ;
}
}
if(keep == false)
{
resultArray.push(values1[n]);
keep = false
}
}
if( resultArray.length > 0 ) {
s2.getRange(Alast+1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}
}

Counting non empty cells with matching font color in Google Sheets

I'm using a custom function to count the number of cells with a matching font color in a range.
function countIfFont(countRange,fontRef,rangeSum) {
var activeRange = SpreadsheetApp.getActiveRange();
var activeSheet = activeRange.getSheet();
var range = activeSheet.getRange(countRange);
var rangeHeight = range.getHeight();
var rangeWidth = range.getWidth();
var fc = range.getFontColors();
var fontCell = activeSheet.getRange(fontRef);
var font = fontCell.getFontColor();
var count = 0;
for(var i = 0; i < rangeHeight; i++)
for(var j = 0; j < rangeWidth; j++)
if(fc[i][j] == font)
count = count+1;
return count;
};
It works, but it is counting blank cells and I want it to exclude blank cells. How do I check if the cell is blank?
In your script, how about the following modification?
From:
for(var i = 0; i < rangeHeight; i++)
for(var j = 0; j < rangeWidth; j++)
if(fc[i][j] == font)
count = count+1;
To:
var values = range.getDisplayValues();
for (var i = 0; i < rangeHeight; i++)
for (var j = 0; j < rangeWidth; j++)
if (fc[i][j] == font && values[i][j])
count = count + 1;
By this modification, when fc[i][j] == font and the cell is not empty, count = count + 1 is run.

Compiling time takes too long

Here is my code:
function dataValidation()
{
var ss1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("2019년 출결 정보");
var ss2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("원생 정보");
var array = [];
for (var c = 0; c <= 1000; c++)
{
array[c] = [];
}
var count = 0;
var lastRow1;
var data1 = ss1.getRange("C:C").getValues();
for (var k = data1.length-1; k >= 0; k--)
{
if (data1[k][0] != null && data1[k][0] != '')
{
lastRow1 = k+1;
break;
}
}
var lastRow2;
var data2 = ss2.getRange("A:A").getValues();
for (var n = data2.length-1; n >=0; n--)
{
if (data2[n][0] != null && data2[n][0] != '')
{
lastRow2 = n+1;
break;
}
}
for (var i = 2; i <= lastRow1; i++)
{
for (var j = 2; j <= lastRow2; j++)
{
if (ss1.getRange(i, 3).getDisplayValue() == ss2.getRange(j, 1).getDisplayValue())
{
array[i-1][count] = ss2.getRange(j, 2).getDisplayValue();
count++;
}
}
var rule = SpreadsheetApp.newDataValidation().requireValueInList(array[i-1], true).setAllowInvalid(false).build();
ss1.getRange(i, 4).setDataValidation(rule);
count = 0;
}
}
I am so concerned because the compile speed takes too long... It takes about a minute to fully execute :(
Execution hint suggests to change from line 71:
for (var i = 2; i <= lastRow1; i++)
{
for (var j = 2; j <= lastRow2; j++)
{
if (ss1.getRange(i, 3).getDisplayValue() == ss2.getRange(j, 1).getDisplayValue())
{
array[i-1][count] = ss2.getRange(j, 2).getDisplayValue();
count++;
}
}
Personally I think this is because of nested loops but I don't have any clever ideas to replace this loops, nor I have much knowledge about google apps script.
What else I can do to decrease compile time?

Search for values in arrays

I've a spreadsheet with two sheets (Foglio1, Foglio2)
Foglio1 has five rows of numeric values in two columns, Foglio2 2 has five rows of numeric values in the first column.
I'd like to search for the Foglio2 values in Foglio1 and if it finds something copy the respective value of Foglio1, column2 into Foglio2, column2.
This is what I've got so far but it doesn't seems to work, basically it doesn't find anything so the result array remains empty
function cercaCopia() {
var ss = SpreadsheetApp.openById('myfileIDhere');
var data1 = ss.getSheetByName('Foglio2').getRange(1, 1, 5).getValues();
var data2 = ss.getSheetByName('Foglio1').getRange(1, 1, 5, 2).getValues();
var result = new Array(4);
for (var i = 0; i < 5; i++) {
for (var j = 0; j < 5; j++) {
if (data1[i] == data2[j, 0]) {
result[i] = data2[j, 1]
}
}
}
}
This works:
function myFunction() {
var ss = SpreadsheetApp.openById('sheetid');
var data1 = ss.getSheetByName('Foglio2').getRange(1, 1, 5).getValues();
var data2 = ss.getSheetByName('Foglio1').getRange(1, 1, 5, 2).getValues();
for (var j=0; j<5;j++){
for (var i = 0; i < 5; i++) {
if (data1[j][0]==data2[i][0]){
var range= ss.getSheetByName('Foglio2').getRange(1,1,5,5);
range.getCell(j+1,2).setValue(data2[i][1]);
}
}
}
}
I get this as a result:
In Foglio1 I had this:

Google script Execution failed: please try again later and consider using batch operations. The user is over quota

I have a script where I'm syncing my google contacts with google spreadsheet.
I have around 11000 contacts in my account and I've written a function getContacts which fetches all contact information from the google contacts and sends it to a function printContacts,how ever as there are too many contacts the script fails to execute to completion.
I tried using the code to create a trigger everytime the max execution time is reached but now I'm facing a new problem,as I have too many ContactsApi call the script is showing an error saying 'user quota exceeded'
If anyone can get this code to work,it'd be a great help
//Function gets the contacts from the Google Contacts and stores in an array. Calls printContacts function with that array and no. of rows as argument
function getContacts() {
var startTime= (new Date()).getTime();
Logger.log("start time set")
var scriptProperties = PropertiesService.getScriptProperties();
var num_contacts = scriptProperties.getProperty('num_contacts');
Logger.log("script property num_contacts : "+Number(num_contacts))
setHeader();
var groupName = 'System Group: My Contacts';
var group = ContactsApp.getContactGroup(groupName);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var contacts = ContactsApp.getContactsByGroup(group);
var allContacts = [];
var contactDetails = [];
var data, numData, dataArray = [], extraArray = [];
var contact_length = contacts.length;
Logger.log("contact_length : "+contact_length);
Logger.log("contacts.length : "+contacts.length);
var MAX_RUNNING_TIME = 300000;
var REASONALBLE_TIME_TO_WAIT = 60000;
var limit = contact_length;
Logger.log("limit :"+limit)
for(var i=Number(num_contacts); i <= contacts.length; i++) {
var currTime = (new Date()).getTime();
if(currTime - startTime >= MAX_RUNNING_TIME){
Logger.log("Value of i in if section : "+i)
scriptProperties.setProperty("num_contacts",i);
ScriptApp.newTrigger("getContacts")
.timeBased()
.at(new Date(currTime+REASONALBLE_TIME_TO_WAIT))
.create();
Logger.log("trigger created for i = "+i)
break;
}
else{
if(i < contacts.length)
{
allContacts[i] = [];
contactDetails[0] = contacts[i].getGivenName();
contactDetails[1] = contacts[i].getFamilyName();
data = contacts[i].getEmails();
numData = data.length;
for(var j = 0; j < numData; j++) {
dataArray[j] = data[j].getAddress();
}
contactDetails[2] = dataArray.join("\n");
dataArray = [];
data = contacts[i].getPhones(ContactsApp.Field.MOBILE_PHONE);
numData = data.length;
for(var j = 0; j < numData; j++) {
dataArray[j] = data[j].getPhoneNumber();
}
contactDetails[3] = dataArray.join("\n");
dataArray = [];
data = contacts[i].getPhones(ContactsApp.Field.WORK_PHONE);
numData = data.length;
for(var j = 0; j < numData; j++) {
dataArray[j] = data[j].getPhoneNumber();
}
contactDetails[5] = dataArray.join("\n");
dataArray = [];
// new section for home_phone ----- start
data = contacts[i].getPhones(ContactsApp.Field.HOME_PHONE);
numData = data.length;
for(var j = 0; j < numData; j++){
dataArray[j] = data[j].getPhoneNumber();
}
contactDetails[6] = dataArray.join("\n");
dataArray = [];
// new section for home_phone ----- end
data = contacts[i].getCompanies();
numData = data.length;
for(var j = 0; j < numData; j++) {
dataArray[j] = data[j].getCompanyName();
extraArray[j] = data[j].getJobTitle();
}
contactDetails[7] = dataArray.join("\n");
dataArray = [];
contactDetails[8] = extraArray.join("\n");
data = contacts[i].getAddresses();
numData = data.length;
for(var j = 0; j < numData; j++) {
dataArray[j] = data[j].getAddress();
}
contactDetails[9] = dataArray.join("\n");
dataArray = [];
contactDetails[10] = contacts[i].getNotes();
data = contacts[i].getCustomFields();
numData = data.length;
for(var j = 0; j < numData; j++) {
dataArray[j] = data[j].getValue();
}
contactDetails[11] = dataArray.join("\n");
dataArray = [];
data = [];
data = contacts[i].getContactGroups();
numData = data.length;
for(var j = 0; j < numData; j++) {
if(data[j].getName() == 'System Group: My Contacts')
{
continue;
}
else
{
dataArray[j] = data[j].getName();
}
}
contactDetails[4] = dataArray.join("\n");
dataArray = [];
contactDetails[12] = 'saved';
contactDetails[13] = contacts[i].getId();
for(var j = 0; j < 14; j++) {
allContacts[i][j] = contactDetails[j];
}
}
}
}
Logger.log("last value of i "+i);
Logger.log("num of contacts "+allContacts.length)
printContacts(allContacts, contacts.length);
setProperties_getContacts();
return;
}
//Function to print contacts to the spreadsheet.
function printContacts(contactsArray, i) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getRange(2, 1, i, 14);
range.setValues(contactsArray);
}