Get the current table within the for loop - office-scripts

This code:
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getWorksheet('MySheet');
let tables = sheet.getTables();
let rowCount = 0;
for (let i = 0; i < tables.length; i++) {
rowCount = sheet.getTable[i].getRangeBetweenHeaderAndTotal().getRowCount();
console.log(rowCount);
};
}
Is returning the error:
Line 7: sheet.getTable[i] is undefined
How do I express: get the current table within the for loop?

Technically, getTable is a method that accepts the name of the table. Passing in the index doesn't work.
You can always do it this way ...
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getWorksheet('MySheet');
let tables = sheet.getTables();
let rowCount = 0;
tables.forEach((table) => {
rowCount = table.getRangeBetweenHeaderAndTotal().getRowCount();
console.log(rowCount);
});
}
... or use the index of the tables variable that you already defined ...
rowCount = tables[i].getRangeBetweenHeaderAndTotal().getRowCount();

Related

Find a range of an object in google apps script

I am a newbie with coding and am trying to get the minimum value of a column (of a temporary sheet) and then copy that value and some data from the corresponding row to another sheet. For some reason it seems to work only once during the loop, is it because I'm trying to define a range based on an object?
function create_filter(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet1 = ss.getSheetByName("APperCountry");
const sheet2 =ss.getSheetByName("Tender");
var lanelist = sheet2.getRange(2, 1, sheet2.getLastRow(), 8).getValues();
var country = ('B:B');
var origin = ('E:E');
for(var i=2; i<=lanelist.length;i++){
Logger.log("Filter has been added.");
country = ('B'+i);
Logger.log(country);
var origin = ('E'+i)
var calc = ('M'+i);
var apname = ('N'+i);
const ori = sheet2.getRange(origin);
if(ori.isBlank()){
continue;
}
const range = sheet1.getRange("A:D");
const filter = range.createFilter();
var Ctry = sheet2.getRange(country).getValue();
const Filter_Criteria1 = SpreadsheetApp.newFilterCriteria().whenTextContains(Ctry);
const coll1 = 1;
const add_filter1 = filter.setColumnFilterCriteria(coll1,Filter_Criteria1);
const new_sheet = ss.insertSheet();
new_sheet.setName("AirportDistanceCalc");
var tempsheet = ss.getSheetByName('AirportDistanceCalc');
range.copyTo(new_sheet.getRange(1,1));
var aplist = new_sheet.getRange(2, 1, new_sheet.getLastRow()-1, 8).getValues();
new_sheet.getRange(1,5,1,1).setValue("Origin")
new_sheet.getRange(1,6,1,1).setValue("DistanceKM")
for(var j=0; j<aplist.length;j++){
Logger.log(origin);
ori.copyTo(new_sheet.getRange(j+2,5));
mainFun()
}
let comparisonRange = tempsheet.getRange("F2:F");
let comparisonRangeValues = comparisonRange.getValues().filter(String);
let minimum = comparisonRangeValues[0][0];
comparisonRangeValues.forEach((rowItem, rowIndex) => {
comparisonRangeValues[rowIndex].forEach((columnItem) => {
minimum = Math.min(minimum, columnItem);
});
});
console.log(minimum);
sheet2.getRange(calc).setValue(minimum);
tempsheet.getRange(minimum, 2).copyTo(sheet2.getRange(apname));
if (tempsheet) {
ss.deleteSheet(tempsheet);
}
filter.remove();
}
}
The minimum of a column
function mincolumn(col=1) {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet1");
const min = sh.getRange(1,col,sh.getLastRow()).getValues().flat().filter(e => !isNaN(e)).sort((a,b) => a - b)[0];
Logger.log(min);
}

INVALID_ARGUMENT: cannot write more than 500 entities in a single call

I wanna store more than 500 docs in firestore based on clients requirement. I faced the same issue while writing(setting) documents to the firebase. After a lot of research in net i created my own solution.
Hope this helps u..!
This code is for creating 5000 dummy records.
const trailContacts = () => {
let names = [];
for (let index = 1; index < 5002; index++) {
names.push({
name: 'trail',
});
}
return names
};
and this is the code for storing names to firebase-firestore.
let contacts = trailContacts();
let count = Math.ceil(contacts.length/500);
for (let index =0; index < count; index++) {
let splicedContacts = contacts.splice(0, 499);
let contactsBatch = db.batch();
splicedContacts.forEach((con) => {
let collection = {};
let name = con.name;
let collectionRef = db.collection('trail');
contactsBatch.set(collectionRef, collection);
});
await contactsBatch.commit();
}

Google Sheet custom function not returning string

I am new to Google Sheet scripting.
I am writing a code to strip the sixth components from a long text that is based on a naming convention. The text have 6 parts all separated by an underscore. However, my code is not returning anything
function RetailerStrip(account) {
var count = 0;
var retname = "";
var retcount = 0;
for(var i = 0, len = account.length; i < len; i++) {
if (account[i] =="_") {
++count;
}
if (count == 5) {
retname[retcount]= account[i];
++retcount;
}
}
return retname;
}
I then call this function from sheet as below
=RetailerStrip("abc_def_ghi_jkl_mno_pqr")
When I tried to declare 'retname' as an array the function did return the required text (fifth component) but the text was spread across multiple cells with on character in each cell, and not as a single string in one cell
var retname = [];
Please help
You could try this:
function RetailerStrip(str) { return str.split('_')[5]; }
The split() method creates an array.
But if you prefer to stick with the string-iteration method, you could use this:
function RetailerStrip(account) {
var count = 0;
var retname = []; // Array
var retcount = 0;
for (var i = 0, len = account.length; i < len; i++) {
if (account[i] =="_") {
++count;
}
if (count == 4) {
retname[retcount]= account[i];
++retcount;
}
}
retname.shift(); // To get rid of the underscore from the array
var retnameString = retname.join(''); // To convert the array to a string
return retnameString;
}

Get filename from url google sheet

I have a problem.
How to get the filename from the url?
enter image description here
I wouldn't normally do this since you haven't shown us what you've tried, but I'm feeling generous.
This function should work for you. (Note that you'll need to grant permissions for it to run.)
function getFileNames() {
var sheet = SpreadsheetApp.getActive().getSheetByName("Get_File_Name");
var links = sheet.getRange("A2:A").getValues();
var filenames = [];
for (var i = 0; i < links.length; i++) {
var url = links[i][0];
if (url != "") {
var filename = SpreadsheetApp.openByUrl(links[i][0]).getName();
filenames.push([filename]);
}
}
var startRow = 2; // print in row 2 since row 1 is the header row
var fileNameColumn = 2; // Column B = column 2
var destination = sheet.getRange(startRow, fileNameColumn, filenames.length, filenames[0].length);
destination.setValues(filenames);
}
Another way
function getFileNames() {
var driveApp = DriveApp;
// SET THE SHEET HERE
var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
//SET THE URL LINK COLUMN HERE : From row 2 since row 1 is the header row till last row
var links = sheet.getRange("P2:P").getValues();
var filenames = [];
for (var i = 0; i < links.length; i++) {
var fileId = getIdFromUrl(links[i][0]);
if (fileId != "" && fileId != null) {
var getfile = DriveApp.getFileById(fileId);
var filename = getfile.getName();
Logger.log(filename);
filenames.push([filename]);
} else {
filenames.push([""]);
}
}
// SET STARTING ROW TO PRINT: From row 2 since row 1 is the header row
var startRow = 2;
// SET WHICH COLUMN TO PRINT : Column A = column 1 / Column B = column 2
// MAKE SURE THE SHEET LAST COLUMN HEADER IS FILLED + 1 (next column)
var fileNameColumn = sheet.getLastColumn() + 1;
var destination = sheet.getRange(startRow, fileNameColumn, filenames.length, filenames[0].length);
destination.setValues(filenames);
}
function getIdFromUrl(url) { return url.match(/[-\w]{25,}/); }
You can create a custom function in spreadsheets like this.
function getSSName(name) {
var ss = SpreadsheetApp.openByUrl(url);
return ss.getName();
}

Creating a attachment from Google sheet in ms Excel format via Google script

Is it possible to create an Excel format file from a Google sheet using Google script, so that it can be added as an attachment to an email?
I've got a code that takes columns with certain names (e.g. A, C, F) and turns them into a new sheet (on createCustomStatusTable() function).
https://docs.google.com/spreadsheets/d/1fZ0JMYjoIrfPIxFBVgDNU0x5X0ll201ZCU-lcaTwwcI/edit?usp=sharing
var expected = ['A','C','F'];
var newSpreadSheet = SpreadsheetApp.getActiveSheet();
var tableLastRow = newSpreadSheet.getLastRow();
var tablelastColumn = newSpreadSheet.getLastColumn();
var values = newSpreadSheet.getRange(1, 1, tableLastRow, tablelastColumn).getValues();
var rangeToCopy = [];
function in_array(value, array)
{
for(var i = 0; i < array.length; i++)
{
if(array[i] == value) return true;
}
return false;;
};
function columnsCount() {
var count = 1;
for (var i = 0; i < SpreadsheetApp.getActiveSheet().getLastColumn(); i++) {
if (in_array(values[0][i],expected))
count++;
}
return count;
};
function returnRange() {
for (var i = 1; i < SpreadsheetApp.getActiveSheet().getLastColumn()+1; i++) {
if (in_array(values[0][i-1],expected)) {
rangeToCopy.push(newSpreadSheet.getRange(1, i, newSpreadSheet.getMaxRows()));
};
};
return rangeToCopy;
};
function createCustomStatusTable() {
var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Target');
for (var i = 1; i < columnsCount(); i++) {
returnRange()[i-1].copyTo(targetSheet.getRange(1,i));
};
};
Thank you in advance for any help
You can create an EXCEL type file with DriveApp:
The problem is, that the content must be a string. And I haven't tested for a way to make that work.
I know this doesn't answer your question. Hopefully someone knows for sure how to create an EXCEL file from a Google Sheet.

Resources