This guide provides example Google Workspace code templates for specific ALIS API (v2) endpoints. You can copy the code from these templates directly into the Apps Script editor.
For more information on ALIS API exports, refer to this guide: ALIS API Reference Guide.
Why do I need specific templates for Google Workspace?
While Microsoft Excel and Power BI use the same "Power Query" engine, Google Sheets requires a completely different approach.
Google Workspace uses Google Apps Script (based on JavaScript) to connect to external APIs. Because of this language difference, the scripts used for Excel or Power BI will not work in Google Sheets. The templates in this guide are written specifically for the Google Workspace environment.
Google Workspace Templates
Billing
function fetchAlisGlTransactions() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// --- 1. CONFIGURATION ---
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const baseUrl = 'https://api.alisonline.com/v2/export/billing/glTransactions';
// Create Basic Auth Header
const authHeader = 'Basic ' + Utilities.base64Encode(username + ':' + password);
let allRows = [];
let pageNumber = 1;
let hasNextPage = true;
// --- 2. DEFINE HEADERS (All 20 fields) ---
const headers = [
"Community ID",
"Community Name",
"Community State",
"Resident ID",
"Resident Name",
"Product Type",
"Classification",
"Status",
"GL Date",
"Transaction Number",
"GL Account Number",
"Payer Type",
"Action",
"Debit Amount",
"Credit Amount",
"Class",
"Item",
"Dept",
"Is Exported",
"Created At"
];
// Add headers to the master list
allRows.push(headers);
// --- 3. LOOP THROUGH PAGES ---
while (hasNextPage) {
// Construct URL with pagination
const url = baseUrl + "?pageNumber=" + pageNumber + "&pageSize=100";
try {
const response = UrlFetchApp.fetch(url, {
"method": "get",
"headers": { "Authorization": authHeader },
"muteHttpExceptions": true
});
// Stop if API returns an error
if (response.getResponseCode() !== 200) {
Logger.log("Error on page " + pageNumber + ": " + response.getContentText());
break;
}
const json = JSON.parse(response.getContentText());
const items = json.items;
// --- 4. PROCESS DATA (Map fields) ---
if (items && items.length > 0) {
items.forEach(item => {
allRows.push([
item.communityId,
item.communityName,
item.communityState,
item.residentId,
item.residentFullName,
item.residentProductType,
item.residentClassification,
item.residentStatus,
item.glDate,
item.txnNumber,
item.glAccountNumber,
item.payerType,
item.action,
item.debitAmount,
item.creditAmount,
item.class,
item.item,
item.dept,
item.isExported,
item.createdAt
]);
});
}
// --- 5. CHECK PAGINATION ---
hasNextPage = json.hasNextPage;
pageNumber++;
// Sleep to prevent rate limits
Utilities.sleep(200);
} catch (e) {
Logger.log("Script failed: " + e.toString());
hasNextPage = false;
}
}
// --- 6. WRITE TO SHEET ---
if (allRows.length > 0) {
sheet.clear();
sheet.getRange(1, 1, allRows.length, allRows[0].length).setValues(allRows);
}
}Care
function fetchAlisRecordedCare() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// --- 1. CONFIGURATION ---
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const baseUrl = 'https://api.alisonline.com/v2/export/care/recordedCare';
// Encode credentials
const authHeader = 'Basic ' + Utilities.base64Encode(username + ':' + password);
let allRows = [];
let pageNumber = 1;
let hasNextPage = true;
// --- 2. DEFINE HEADERS (All 29 fields) ---
const headers = [
"Recorded Care ID",
"Community ID",
"Community Name",
"State",
"Resident ID",
"Resident Name",
"Product Type",
"Classification",
"Resident Status",
"By Hour",
"By Shift",
"By Week Day",
"By Week No",
"Care Date",
"Care Time",
"Care Item Name",
"Care Item Category",
"Care List Name",
"Care List Group",
"Is Not Recorded",
"Is PRN",
"Assigned To ID",
"Recorded By ID",
"Recorded Date/Time",
"Reporting Label",
"Outcome Text",
"Outcome Notes",
"Time Estimated",
"Time Taken"
];
allRows.push(headers);
// --- 3. LOOP THROUGH PAGES ---
while (hasNextPage) {
const url = baseUrl + "?pageNumber=" + pageNumber + "&pageSize=100";
try {
const response = UrlFetchApp.fetch(url, {
"method": "get",
"headers": { "Authorization": authHeader },
"muteHttpExceptions": true
});
if (response.getResponseCode() !== 200) {
Logger.log("Error on page " + pageNumber + ": " + response.getContentText());
break;
}
const json = JSON.parse(response.getContentText());
const items = json.items;
// --- 4. PROCESS DATA (Map 29 fields) ---
if (items && items.length > 0) {
items.forEach(item => {
allRows.push([
item.recordedCareId,
item.communityId,
item.communityName,
item.state,
item.residentId,
item.residentName,
item.residentProductType,
item.residentClassification,
item.residentStatus,
item.byHour,
item.byShift,
item.byWeekDay,
item.byWeekNo,
item.careDate,
item.careTime,
item.careItemName,
item.careItemCategory,
item.careListName,
item.careListGroup,
item.isCareNotRecorded,
item.isPrnCare,
item.assignedToID,
item.recordedByID,
item.recordedDateTime,
item.reportingLabel,
item.outcomeText,
item.outcomeNotes,
item.timeEstimated,
item.timeTaken
]);
});
}
// --- 5. CHECK PAGINATION ---
hasNextPage = json.hasNextPage;
pageNumber++;
Utilities.sleep(200);
} catch (e) {
Logger.log("Script failed: " + e.toString());
hasNextPage = false;
}
}
// --- 6. WRITE TO SHEET ---
if (allRows.length > 0) {
sheet.clear();
sheet.getRange(1, 1, allRows.length, allRows[0].length).setValues(allRows);
}
}Clinical
function fetchAlisOrderAdministration() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// --- 1. CONFIGURATION ---
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const baseUrl = 'https://api.alisonline.com/v2/export/clinical/orderAdministration';
// Encode credentials for Basic Auth
const authHeader = 'Basic ' + Utilities.base64Encode(username + ':' + password);
let allRows = [];
let pageNumber = 1;
let hasNextPage = true;
// --- 2. DEFINE HEADERS (All 26 fields) ---
const headers = [
"Community ID",
"Community Name",
"State",
"Resident ID",
"Resident Name",
"Product Type",
"Classification",
"Resident Status",
"Order ID",
"Order Name",
"Order Type",
"Scheduled Date",
"Scheduled Time",
"Passed Time",
"By Shift",
"By Hour",
"Exception Reason",
"Admin Note",
"Dose Administered",
"Is PRN",
"Is Not Recorded",
"Status",
"Status Note",
"Recorded By ID",
"Recorder Name",
"Recorder Role"
];
// Add headers to the array
allRows.push(headers);
// --- 3. LOOP THROUGH PAGES ---
while (hasNextPage) {
const url = baseUrl + "?pageNumber=" + pageNumber + "&pageSize=100";
try {
const response = UrlFetchApp.fetch(url, {
"method": "get",
"headers": { "Authorization": authHeader },
"muteHttpExceptions": true
});
// Stop if API returns an error
if (response.getResponseCode() !== 200) {
Logger.log("Error on page " + pageNumber + ": " + response.getContentText());
break;
}
const json = JSON.parse(response.getContentText());
const items = json.items;
// --- 4. PROCESS DATA (Map 26 fields) ---
if (items && items.length > 0) {
items.forEach(item => {
allRows.push([
item.communityId,
item.communityName,
item.state,
item.residentId,
item.residentName,
item.residentProductType,
item.residentClassification,
item.residentStatus,
item.orderId,
item.orderName,
item.orderType,
item.scheduledDate,
item.scheduledTime,
item.passedTime,
item.byShift,
item.byHour,
item.exceptionReason,
item.adminNote,
item.doseAdministered,
item.isPrn, // Boolean
item.isNotRecorded, // Boolean
item.status,
item.statusNote,
item.recordedBy,
item.recorderName,
item.recorderRole
]);
});
}
// --- 5. CHECK PAGINATION ---
hasNextPage = json.hasNextPage;
pageNumber++;
// Pause to be kind to the API
Utilities.sleep(200);
} catch (e) {
Logger.log("Script failed: " + e.toString());
hasNextPage = false;
}
}
// --- 6. WRITE TO SHEET ---
if (allRows.length > 0) {
sheet.clear();
// Write all data at once
sheet.getRange(1, 1, allRows.length, allRows[0].length).setValues(allRows);
}
} Communities
function fetchAlisHqOccupancies() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// --- 1. CONFIGURATION ---
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const baseUrl = 'https://api.alisonline.com/v2/export/communities/floorPlan/hqOccupancies';
// Encode credentials
const authHeader = 'Basic ' + Utilities.base64Encode(username + ':' + password);
let allRows = [];
let pageNumber = 1;
let hasNextPage = true;
// --- 2. DEFINE HEADERS (All 107 fields) ---
const headers = [
// Date Object (Flattened)
"Date Year", "Date Month", "Date Day", "Date WeekDay", "Date DayOfYear", "Date DayNumber",
"Forecast Status",
"Company ID", "Company GUID", "Company Name", "Company URL",
"Resident ID", "Resident Name", "Resident Status", "Resident First Name", "Resident Last Name",
"Resident Room", "Resident Care Level", "Resident Product Type", "Resident Classification", "Resident Name Link",
"Community ID", "Community Name", "ALIS Community Region", "Owner", "Region", "State", "City", "Zip", "Time Zone",
"Move In From Address", "Physical Move In Date",
// Financial Move In Date (Flattened)
"Fin Move In Year", "Fin Move In Month", "Fin Move In Day",
// Financial Move Out Date (Flattened)
"Fin Move Out Year", "Fin Move Out Month", "Fin Move Out Day",
"Physical Move Out Date", "Fin Move Out Date (No Hotel)", "Move Out Destination",
"Room ID", "Room Category ID", "Unit", "Unit Disabled", "Floor", "Size", "Hall", "Type", "Rooms", "Unit Description",
"Census Value", "Census Move In", "Census Move Out", "Census Occ",
"Fin Census Move In", "Fin Census Move Out", "Fin Census Occ", "Data Set",
"Door Number", "Doorknob Value", "Door Capacity", "Room Change Date",
"Prior Door Number", "Prior Is Primary", "Prior Room ID", "Prior End Date", "Prior Bed Number",
"Prior Product Type", "Prior Classification", "Prior Room Change Date", "Prior Unit Category",
"Is Primary", "Primary Status Change", "Res Classification Change Date",
"Product Type", "Is On Leave", "Is Transfer", "Move In Type", "Bed Number", "Classification",
"Market Rate", "Category", "Category Sort",
"Bed Move In", "Bed Move Out", "Bed Occ",
"Doorknob Move In", "Doorknob Move Out", "Doorknob Occ",
"Room Assignment Rank", "Product Type Change Date", "Budget",
// Partition Date (Flattened)
"Partition Year", "Partition Month", "Partition Day",
"Updated From Alis", "Partition Type", "Hotel Rules", "Move Out Reason",
"Room Assignment Start Date", "Room Assignment End Date",
"Number Of Rooms", "Last Room", "Occ Status", "Number Of Room Assignments",
"Product Type Reporting Label", "Expected Move Out Reason", "Move In From Description",
"Bed Capacity", "Number Of Residents",
"Referral Source Name", "Referral Type", "Referral Organization", "Prospect Source", "Source Category"
];
allRows.push(headers);
// --- 3. LOOP THROUGH PAGES ---
while (hasNextPage) {
const url = baseUrl + "?pageNumber=" + pageNumber + "&pageSize=100";
try {
const response = UrlFetchApp.fetch(url, {
"method": "get",
"headers": { "Authorization": authHeader },
"muteHttpExceptions": true
});
if (response.getResponseCode() !== 200) {
Logger.log("Error on page " + pageNumber + ": " + response.getContentText());
break;
}
const json = JSON.parse(response.getContentText());
const items = json.items;
// --- 4. PROCESS DATA ---
if (items && items.length > 0) {
items.forEach(item => {
// Helper to safely get nested date fields (returns empty string if date object is null)
const getD = (dateObj, key) => (dateObj ? dateObj[key] : "");
allRows.push([
// Date Object
getD(item.date, 'year'), getD(item.date, 'month'), getD(item.date, 'day'),
getD(item.date, 'dayOfWeek'), getD(item.date, 'dayOfYear'), getD(item.date, 'dayNumber'),
item.forecastStatus,
item.companyId, item.companyGuid, item.companyName, item.companyUrl,
item.residentId, item.residentName, item.residentStatus, item.residentFirstName, item.residentLastName,
item.residentRoom, item.residentCareLevel, item.residentProductType, item.residentClassification, item.residentNameLink,
item.communityId, item.communityName, item.alisCommunityRegion, item.owner, item.region, item.state, item.city, item.zip, item.timeZone,
item.moveInFromAddress, item.physicalMoveInDate,
// Financial Move In Date Object
getD(item.financialMoveInDate, 'year'), getD(item.financialMoveInDate, 'month'), getD(item.financialMoveInDate, 'day'),
// Financial Move Out Date Object
getD(item.financialMoveOutDate, 'year'), getD(item.financialMoveOutDate, 'month'), getD(item.financialMoveOutDate, 'day'),
item.physicalMoveOutDate, item.financialMoveOutDateNoHotel, item.moveOutDestination,
item.roomId, item.roomCategoryId, item.unit, item.unitDisabled, item.floor, item.size, item.hall, item.type, item.rooms, item.unitDescription,
item.censusValue, item.censusMoveIn, item.censusMoveOut, item.censusOcc,
item.finCensusMoveIn, item.finCensusMoveOut, item.finCensusOcc, item.dataSet,
item.doorNumber, item.doorknobValue, item.doorCapacity, item.roomChangeDate,
item.priorDoorNumber, item.priorIsPrimary, item.priorRoomId, item.priorEndDate, item.priorBedNumber,
item.priorProductType, item.priorClassification, item.priorRoomChangeDate, item.priorUnitCategory,
item.isPrimary, item.primaryStatusChange, item.residentClassificationChangeDate,
item.productType, item.isOnLeave, item.isTransfer, item.moveInType, item.bedNumber, item.classification,
item.marketRate, item.category, item.categorySort,
item.bedMoveIn, item.bedMoveOut, item.bedOcc,
item.doorknobMoveIn, item.doorknobMoveOut, item.doorknobOcc,
item.roomAssignmentRank, item.productTypeChangeDate, item.budget,
// Partition Date Object
getD(item.partition, 'year'), getD(item.partition, 'month'), getD(item.partition, 'day'),
item.updatedFromAlis, item.partitionType, item.hotelRules, item.moveOutReason,
item.roomAssignmentStartDate, item.roomAssignmentEndDate,
item.numberOfRooms, item.lastRoom, item.occStatus, item.numberOfRoomAssignments,
item.productTypeReportingLabel, item.expectedMoveOutReason, item.moveInFromDescription,
item.bedCapacity, item.numberOfResidents,
item.referralSourceName, item.referralType, item.referralOrganization, item.prospectSource, item.sourceCategory
]);
});
}
// --- 5. CHECK PAGINATION ---
hasNextPage = json.hasNextPage;
pageNumber++;
Utilities.sleep(200);
} catch (e) {
Logger.log("Script failed: " + e.toString());
hasNextPage = false;
}
}
// --- 6. WRITE TO SHEET ---
if (allRows.length > 0) {
sheet.clear();
sheet.getRange(1, 1, allRows.length, allRows[0].length).setValues(allRows);
}
}Prospects
function fetchAlisProspectTasks() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// --- 1. CONFIGURATION ---
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const baseUrl = 'https://api.alisonline.com/v2/export/prospects/tasks';
// Encode credentials
const authHeader = 'Basic ' + Utilities.base64Encode(username + ':' + password);
let allRows = [];
let pageNumber = 1;
let hasNextPage = true;
// --- 2. DEFINE HEADERS (All 44 fields) ---
const headers = [
"Community ID",
"Community Name",
"Community State",
"Prospect ID",
"External CRM ID",
"Full Name",
"First Name",
"Last Name",
"Product Type",
"Referral Source ID",
"Referral Source Name",
"Referral Org ID",
"Referral Organization",
"Referral Type",
"Prospect Resident ID",
"Inquiry Date",
"Prospect Score",
"Prospect Stage",
"Street 1",
"Street 2",
"City",
"State",
"Zip",
"Phone Number",
"Email",
"Main Contact Name",
"Main Contact Street 1",
"Main Contact Street 2",
"Main Contact City",
"Main Contact State",
"Main Contact Zip",
"Main Contact Phone",
"Main Contact Email",
"Main Contact Preference",
"Marketing Status",
"Expected Move In",
"Move In Date",
"Is Locked",
"Assigned Agent ID",
"Assigned Agent Name",
"Assigned Agent Role",
"Prospect Source",
"Created At",
"Last Updated At"
];
allRows.push(headers);
// --- 3. LOOP THROUGH PAGES ---
while (hasNextPage) {
const url = baseUrl + "?pageNumber=" + pageNumber + "&pageSize=100";
try {
const response = UrlFetchApp.fetch(url, {
"method": "get",
"headers": { "Authorization": authHeader },
"muteHttpExceptions": true
});
if (response.getResponseCode() !== 200) {
Logger.log("Error on page " + pageNumber + ": " + response.getContentText());
break;
}
const json = JSON.parse(response.getContentText());
const items = json.items;
// --- 4. PROCESS DATA ---
if (items && items.length > 0) {
items.forEach(item => {
allRows.push([
item.communityId,
item.communityName,
item.communityState,
item.prospectId,
item.externalCrmId,
item.fullName,
item.firstName,
item.lastName,
item.productType,
item.referralSourceId,
item.referralSourceName,
item.referralOrganizationId,
item.referralOrganization,
item.referralType,
item.prospectResidentId,
item.inquiryDate,
item.prospectScore,
item.prospectStage,
item.street1,
item.street2,
item.city,
item.state,
item.zip,
item.phoneNumber,
item.email,
item.mainContactFullName,
item.mainContactStreet1,
item.mainContactStreet2,
item.mainContactCity,
item.mainContactState,
item.mainContactZip,
item.mainContactPhoneNumber,
item.mainContactEmail,
item.mainContactContactPreference,
item.marketingStatus,
item.expectedMoveInDate,
item.moveInDate,
item.isLocked, // Boolean
item.assignedSalesAgentId,
item.assignedAgentName,
item.assignedAgentRole,
item.prospectSource,
item.createdAt,
item.lastUpdatedAt
]);
});
}
// --- 5. CHECK PAGINATION ---
hasNextPage = json.hasNextPage;
pageNumber++;
Utilities.sleep(200);
} catch (e) {
Logger.log("Script failed: " + e.toString());
hasNextPage = false;
}
}
// --- 6. WRITE TO SHEET ---
if (allRows.length > 0) {
sheet.clear();
sheet.getRange(1, 1, allRows.length, allRows[0].length).setValues(allRows);
}
}Residents
function fetchAlisResidentObservations() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// --- 1. CONFIGURATION ---
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const baseUrl = 'https://api.alisonline.com/v2/export/residents/observations';
// Encode credentials
const authHeader = 'Basic ' + Utilities.base64Encode(username + ':' + password);
let allRows = [];
let pageNumber = 1;
let hasNextPage = true;
// --- 2. DEFINE HEADERS (All 18 fields) ---
const headers = [
"Observation ID",
"Company GUID",
"Community ID",
"Community Name",
"State",
"Resident ID",
"Resident Name",
"Product Type",
"Classification",
"Resident Status",
"Observation Type",
"Observation Text",
"Severity",
"Occurred On",
"Created At",
"Expires At",
"Recorded By",
"Status"
];
allRows.push(headers);
// --- 3. LOOP THROUGH PAGES ---
while (hasNextPage) {
const url = baseUrl + "?pageNumber=" + pageNumber + "&pageSize=100";
try {
const response = UrlFetchApp.fetch(url, {
"method": "get",
"headers": { "Authorization": authHeader },
"muteHttpExceptions": true
});
if (response.getResponseCode() !== 200) {
Logger.log("Error on page " + pageNumber + ": " + response.getContentText());
break;
}
const json = JSON.parse(response.getContentText());
const items = json.items;
// --- 4. PROCESS DATA ---
if (items && items.length > 0) {
items.forEach(item => {
allRows.push([
item.observationId,
item.companyGuid,
item.communityId,
item.communityName,
item.state,
item.residentId,
item.residentName,
item.residentProductType,
item.residentClassification,
item.residentStatus,
item.observationType,
item.observationText,
item.severity,
item.occurredOn,
item.createdAt,
item.expiresAt,
item.recordedBy,
item.status
]);
});
}
// --- 5. CHECK PAGINATION ---
hasNextPage = json.hasNextPage;
pageNumber++;
Utilities.sleep(200);
} catch (e) {
Logger.log("Script failed: " + e.toString());
hasNextPage = false;
}
}
// --- 6. WRITE TO SHEET ---
if (allRows.length > 0) {
sheet.clear();
sheet.getRange(1, 1, allRows.length, allRows[0].length).setValues(allRows);
}
} function fetchAlisIncidentsAllFields() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
// --- CONFIGURATION ---
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const baseUrl = 'https://api.alisonline.com/v2/export/residents/incidents';
// Encode credentials for Basic Auth
const authHeader = 'Basic ' + Utilities.base64Encode(username + ':' + password);
let allRows = [];
let pageNumber = 1;
let hasNextPage = true;
// --- 1. DEFINE HEADERS (All 21 fields) ---
const headers = [
"Community ID",
"Community Name",
"Resident ID",
"Resident Name",
"Room Number",
"Resident Status",
"Product Type",
"Classification",
"Incident ID",
"Status",
"Is Complete",
"Created By Name",
"Created By ID",
"Incident Date/Time",
"Incident Type",
"Incident Location",
"Summary",
"Completed Forms",
"Completed Tasks",
"Incomplete Forms",
"Incomplete Tasks"
];
// Add headers as the first row
allRows.push(headers);
// --- 2. LOOP THROUGH PAGES ---
while (hasNextPage) {
const url = baseUrl + "?pageNumber=" + pageNumber + "&pageSize=100";
try {
const response = UrlFetchApp.fetch(url, {
"method": "get",
"headers": { "Authorization": authHeader },
"muteHttpExceptions": true
});
// Stop if API returns an error
if (response.getResponseCode() !== 200) {
Logger.log("Error on page " + pageNumber + ": " + response.getContentText());
break;
}
const json = JSON.parse(response.getContentText());
const items = json.items;
// --- 3. PROCESS DATA (Map all fields) ---
if (items && items.length > 0) {
items.forEach(item => {
allRows.push([
item.communityId,
item.communityName,
item.residentId,
item.residentFullName,
item.roomNumber,
item.residentStatus,
item.productType,
item.classification,
item.incidentId,
item.status,
item.isComplete, // Boolean (will show as TRUE/FALSE)
item.createdBy,
item.createdById,
item.incidentDateTime,
item.incidentType,
item.incidentLocation,
item.incidentSummary,
item.completedForms,
item.completedTasks,
item.incompleteForms,
item.incompleteTasks
]);
});
}
// --- 4. CHECK PAGINATION ---
hasNextPage = json.hasNextPage;
pageNumber++;
// Small pause to prevent rate limiting
Utilities.sleep(200);
} catch (e) {
Logger.log("Script failed: " + e.toString());
hasNextPage = false;
}
}
// --- 5. WRITE TO SHEET ---
if (allRows.length > 0) {
sheet.clear();
// Write all data to the sheet in one operation
sheet.getRange(1, 1, allRows.length, allRows[0].length).setValues(allRows);
}
}
Comments
0 comments
Article is closed for comments.