Skip to content

Instantly share code, notes, and snippets.

@JuaneloJuanelo
Last active December 9, 2019 14:00
Show Gist options
  • Select an option

  • Save JuaneloJuanelo/6b349f1406ec50f3819d110e221fea74 to your computer and use it in GitHub Desktop.

Select an option

Save JuaneloJuanelo/6b349f1406ec50f3819d110e221fea74 to your computer and use it in GitHub Desktop.
Shared with Script Lab
name: 'Chart 1.8 API + Report '
description: ''
author: JuaneloJuanelo
host: EXCEL
api_set: {}
script:
content: |
$("#addSampleData").click(() => tryCatch(addSampleData));
$("#CreateLineChart").click(() => tryCatch(CreateLineChart));
$("#SplitCharts").click(() => tryCatch(SplitCharts));
$("#SyncAxis").click(() => tryCatch(SyncAxis));
$("#FormatAxis").click(() => tryCatch(FormatAxis));
$("#SecondaryAxis").click(() => tryCatch(SecondaryAxis));
$("#SetFormat").click(() => tryCatch(SetFormat));
$("#InvertColor").click(() => tryCatch(InvertColor));
$("#AddXYChart").click(() => tryCatch(AddXYChart));
$("#ChangeDataLabels").click(() => tryCatch(ChangeDataLabels));
$("#CleanCharts").click(() => tryCatch(CleanCharts));
$("#report").click(() => tryCatch(createReport));
var startHeight = 550;
var orange = "#FF7C00";
var blue = "#0000FF";
var greyGreen = "#E4E1D2";
var green = "#70ad47";
var red = "#FF0000";
async function CreateLineChart() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
var chart = worksheet.charts.add(Excel.ChartType.line, worksheet.getRange("A3:C35"));
chart.name = "FirstLineChart";
chart.top = startHeight;
chart.left = 10;
var legend = chart.legend;
legend.visible = true;
legend.position = Excel.ChartLegendPosition.bottom;
});
}
async function SplitCharts() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
worksheet.charts.getItem("FirstLineChart").delete();
var chartLemon = worksheet.charts.add(Excel.ChartType.line, worksheet.getRange("A3:B35"));
chartLemon.name = "chartLemon";
chartLemon.top = startHeight;
chartLemon.left = 10;
chartLemon.load("height,width");
await context.sync();
var chartOrange = worksheet.charts.add(Excel.ChartType.line, worksheet.getRange("C3:C35"));
chartOrange.series.getItemAt(0).setXAxisValues(worksheet.getRange("A4:A35"));
chartOrange.name = "chartOrange";
chartOrange.series.getItemAt(0).format.line.color = orange;
chartOrange.top = chartLemon.top + chartLemon.height + 10;
chartOrange.left = 10;
var legend = chartLemon.legend;
legend.visible = true;
legend.position = Excel.ChartLegendPosition.bottom;
legend = chartOrange.legend;
legend.visible = true;
legend.position = Excel.ChartLegendPosition.bottom;
});
}
async function SyncAxis() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
for (var i = 0; i <= 1; i++) {
var chart = worksheet.charts.getItemAt(i);
chart.axes.valueAxis.maximum = 35000;
}
});
}
async function FormatAxis() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
for (var i = 0; i <= 1; i++){
var chart = worksheet.charts.getItemAt(i);
var categoryAxis = chart.axes.categoryAxis;
categoryAxis.majorTimeUnitScale = Excel.ChartAxisTimeUnit.days;
categoryAxis.majorUnit = 7;
categoryAxis.numberFormat = "m/d;@";
chart.axes.valueAxis.numberFormat = "$ #, K";
}
});
}
async function SecondaryAxis() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
var chart = worksheet.charts.getItemAt(0);
var series = chart.series.add("Weekend", 2);
series.chartType = Excel.ChartType.area;
series.setValues(worksheet.getRange("J4:J35"));
//Set Series.AxisGroup to Secondary
series.axisGroup = "Secondary";
var axis = chart.axes.getItem("Value", "Secondary");
axis.maximum = 1;
axis.tickLabelPosition = "None";
chart.title.text = "Lemon";
chart = worksheet.charts.getItemAt(1);
series.format.fill.setSolidColor(orange);
series = chart.series.add("Weekend", 2);
series.chartType = Excel.ChartType.area;
series.setValues(worksheet.getRange("J4:J35"));
//Set Series.AxisGroup to Secondary
series.axisGroup = "Secondary";
axis = chart.axes.getItem("Value", "Secondary");
axis.maximum = 1;
axis.tickLabelPosition = "None";
series.format.fill.setSolidColor(blue);
chart.title.text = "Orange";
});
}
async function SetFormat() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
for (var i = 0; i <= 1; i++) {
var chart = worksheet.charts.getItemAt(i);
chart.title.top = 5;
chart.title.left = 10;
chart.legend.top = 30;
chart.legend.left = 10;
chart.legend.overlay = false;
chart.plotArea.top = 54;
chart.plotArea.height = 142;
//Set PlotArea.Top/Height
chart.series.getItemAt(1).format.fill.setSolidColor(greyGreen);
chart.axes.valueAxis.majorGridlines.visible = false;
// chart.plotArea.load();
// await context.sync();
// console.log(chart.plotArea.top);
// console.log(chart.plotArea.height);
}
});
}
async function InvertColor() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
var chartLemon = worksheet.charts.add(Excel.ChartType.columnClustered, worksheet.getRange("L3:L35"));
chartLemon.series.getItemAt(0).setXAxisValues(worksheet.getRange("A4:A35"));
chartLemon.name = "chartLemonColumn";
var chartOrange = worksheet.charts.add(Excel.ChartType.columnClustered, worksheet.getRange("M3:M35"));
chartOrange.series.getItemAt(0).setXAxisValues(worksheet.getRange("A4:A35"));
chartOrange.name = "chartOrangeColumn";
chartLemon.axes.valueAxis.majorGridlines.visible = false;
chartOrange.axes.valueAxis.majorGridlines.visible = false;
chartLemon.load("height,width");
await context.sync();
chartLemon.top = startHeight;
chartLemon.left = 10 + chartLemon.width + 20;
chartOrange.top = chartLemon.top + chartLemon.height + 10;
chartOrange.left = chartLemon.left;
chartOrange.axes.valueAxis.maximum = 15000;
chartOrange.axes.valueAxis.minimum = -25000;
chartOrange.axes.categoryAxis.tickLabelPosition = Excel.ChartAxisTickLabelPosition.low;
chartLemon.axes.categoryAxis.tickLabelPosition = Excel.ChartAxisTickLabelPosition.low;
chartLemon.axes.valueAxis.numberFormat = "$ #, K";
chartLemon.axes.categoryAxis.numberFormat = "m/d;@";
chartOrange.axes.valueAxis.numberFormat = "$ #, K";
chartOrange.axes.categoryAxis.numberFormat = "m/d;@";
chartLemon.legend.visible = false;
chartOrange.legend.visible = false;
var point = chartOrange.series.getItemAt(0).points.getItemAt(11);
point.dataLabel.showValue = true;
point.dataLabel.showCategoryName = true;
//TODO: Set Series.InvertColor/InvertIfNegative
chartLemon.series.getItemAt(0).invertIfNegative = true;
chartOrange.series.getItemAt(0).invertIfNegative = true;
// await ChangeColor(context, chartLemon);
// await ChangeColor(context, chartOrange);
});
}
async function ChangeColor(context: Excel.RequestContext, chartObject) {
var points = chartObject.series.getItemAt(0).points;
points.load("count");
await context.sync();
var pointCount = points.count;
for (var i = 0; i < pointCount; i++) {
var point = points.getItemAt(i);
point.load("value");
await context.sync();
if (point.value > 0) {
point.format.fill.setSolidColor(green);
}
else {
point.format.fill.setSolidColor(red);
}
}
}
async function AddXYChart() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
var chartxy = worksheet.charts.add(Excel.ChartType.xyscatter, worksheet.getRange("B3:B35"));
chartxy.series.getItemAt(0).setXAxisValues(worksheet.getRange("B4:B35"));
chartxy.series.getItemAt(0).setValues(worksheet.getRange("D4:D35"));
chartxy.series.add("Orange", 1);
chartxy.series.getItemAt(1).setXAxisValues(worksheet.getRange("C4:C35"));
chartxy.series.getItemAt(1).setValues(worksheet.getRange("D4:D35"));
chartxy.name = ("ScatterChart");
chartxy.load("height,width");
await context.sync();
chartxy.top = startHeight + 2 * (chartxy.height + 10);
chartxy.left = 10;
chartxy.dataLabels.showValue = true;
chartxy.title.visible = false;
});
}
async function ChangeDataLabels() {
await Excel.run(async (context) => {
var worksheet = context.workbook.worksheets.getActiveWorksheet();
var chartxy = worksheet.charts.getItem("ScatterChart");
chartxy.axes.categoryAxis.majorGridlines.visible = false;
chartxy.axes.valueAxis.majorGridlines.visible = false;
chartxy.axes.categoryAxis.majorGridlines.visible = true;
chartxy.axes.valueAxis.majorGridlines.visible = true;
// chartxy.axes.valueAxis.minimum = 60;
chartxy.legend.visible = false;
chartxy.dataLabels.showValue = false;
//TODO: DataLabel value from cells
for (var i = 0; i <= 1; i++){
var series = chartxy.series.getItemAt(i);
series.setValues(worksheet.getRange("E4:E35"));
var points = series.points;
points.load("count");
await context.sync();
for (var j = 0; j < points.count; j++) {
var point = points.getItemAt(j);
//console.log(i + " " + j);
var rowIndex = j + 4;
var cell = worksheet.getCell(rowIndex, 7);
cell.load("values");
await context.sync();
//console.log(cell.values.toString());
if (cell.values.toString() == "Hot") {
//console.log(cell.values)
point.dataLabel.text = "Hot";
//point.dataLabel.showCategoryName = true;
}
//point.dataLabel.formula = "=Sales!$H$" + rowIndex;
}
}
console.log("done");
});
}
async function addSampleData() {
try {
await Excel.run(async (context) => {
await OfficeHelpers.ExcelUtilities.forceCreateSheet(context.workbook, "Sales");
let sheet = context.workbook.worksheets.getItem("Sales");
let expensesTable = sheet.tables.add('A3:N3', true);
expensesTable.name = "SalesTable";
expensesTable.getHeaderRowRange().values = [["Date", "Lemon", "Orange", "Temperature", "Leaflets", "Price", "Weekday", "Hot Day", "Total Sale", "Weekend Sale", "Hot Day Sale", "Sales Change Lemon", "Sales Change Orange", "Weeknumber"]];
expensesTable.rows.add(null, [
["7/1/2016", 9409, 4489, 70, 90, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/2/2016", 9604, 4489, 72, 90, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/3/2016", 12100, 5929, 71, 104, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/4/2016", 17956, 9801, 76, 98, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/5/2016", 25281, 13924, 78, 135, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/6/2016", 10609, 4761, 82, 90, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/6/2016", 10609, 4761, 82, 90, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/7/2016", 20449, 10201, 81, 135, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/8/2016", 15129, 7396, 82, 113, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/9/2016", 17956, 9025, 80, 126, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/10/2016", 19600, 9604, 82, 131, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/11/2016", 26244, 14400, 83, 135, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/12/2016", 16900, 9025, 84, 99, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/13/2016", 11881, 5625, 77, 99, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/14/2016", 14884, 7225, 78, 113, 0.25, 0, 0, 0, 0, 0, 0, 0, 0],
["7/15/2016", 9604, 3844, 75, 108, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/16/2016", 6561, 2500, 74, 90, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/17/2016", 13225, 5776, 77, 126, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/18/2016", 17161, 8464, 81, 122, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/19/2016", 14884, 7225, 78, 113, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/20/2016", 5041, 1764, 70, 120, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/21/2016", 6889, 2500, 77, 90, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/22/2016", 12544, 5625, 80, 108, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/23/2016", 14400, 6724, 81, 117, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/24/2016", 14641, 6724, 82, 117, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/25/2016", 24336, 12769, 84, 135, 0.5, 0, 0, 0, 0, 0, 0, 0, 0],
["7/26/2016", 30976, 16641, 83, 158, 0.35, 0, 0, 0, 0, 0, 0, 0, 0],
["7/27/2016", 10816, 4624, 80, 99, 0.35, 0, 0, 0, 0, 0, 0, 0, 0],
["7/28/2016", 9216, 3969, 82, 90, 0.35, 0, 0, 0, 0, 0, 0, 0, 0],
["7/29/2016", 10000, 4356, 81, 95, 0.35, 0, 0, 0, 0, 0, 0, 0, 0],
["7/30/2016", 7744, 3249, 82, 81, 0.35, 0, 0, 0, 0, 0, 0, 0, 0],
["7/31/2016", 5776, 2209, 82, 68, 0.35, 0, 0, 0, 0, 0, 0, 0, 0]
]);
let range = sheet.getRange("P4:Q5");
range.values = [["Temperature Data", ""],["Hot Day Limit", 82]];
let weekdayRange = sheet.getRange("G4:G35");
let data = [];
for (let i = 4; i < 36; i++) {
let item = [];
item.push('=IF(WEEKDAY([@Date],2)>5,"Weekend","Weekday")');
data.push(item);
}
weekdayRange.formulas = data;
//weekdayRange.format.autofitColumns();
let hotDayRange = sheet.getRange("H4:H35");
let data2 = [];
for (let i = 4; i < 36; i++) {
let item = [];
item.push('=IF([@Temperature]>$Q$5,"Hot","")');
data2.push(item);
}
hotDayRange.formulas = data2;
//hotDayRange.format.autofitColumns();
let totalSaleRange = sheet.getRange("I4:I35");
let data3 = [];
for (let i = 4; i < 36; i++) {
let item = [];
item.push('=[@Lemon]+[@Orange]');
data3.push(item);
}
totalSaleRange.formulas = data3;
//totalSaleRange.format.autofitColumns();
let weekendSaleRange = sheet.getRange("J4:J35");
let data4 = [];
for (let i = 4; i < 36; i++) {
let item = [];
item.push('=IF(WEEKDAY([@Date],2)>5,1,NA())');
data4.push(item);
}
weekendSaleRange.formulas = data4;
//weekendSaleRange.format.autofitColumns();
let hotDaySaleRange = sheet.getRange("K4:K35");
let data5 = [];
for (let i = 4; i < 36; i++) {
let item = [];
item.push('=IF([@[Hot Day]]="Normal",NA(),1)');
data5.push(item);
}
hotDaySaleRange.formulas = data5;
//hotDaySaleRange.format.autofitColumns();
let salesChangeLemonRange = sheet.getRange("L5:L35");
let data6 = [];
for (let i = 5; i < 36; i++) {
let item = [];
item.push('=[@Lemon]-OFFSET([@Lemon],-1,0)');
data6.push(item);
}
salesChangeLemonRange.formulas = data6;
//salesChangeLemonRange.format.autofitColumns();
let salesChangeOrangeRange = sheet.getRange("M5:M35");
let data7 = [];
for (let i = 5; i < 36; i++) {
let item = [];
item.push('=[@Orange]-OFFSET([@Orange],-1,0)');
data7.push(item);
}
salesChangeOrangeRange.formulas = data7;
//salesChangeOrangeRange.format.autofitColumns();
let weekNumberRange = sheet.getRange("N4:N35");
let data8 = [];
for (let i = 4; i < 36; i++) {
let item = [];
item.push('=WEEKNUM([@Date])');
data8.push(item);
}
weekNumberRange.formulas = data8;
weekNumberRange.format.autofitColumns();
let numRange1 = sheet.getRange("B4:B35");
let numRange2 = sheet.getRange("C4:C35");
let numRange3 = sheet.getRange("I4:I35");
let numRange4 = sheet.getRange("L4:L35");
let numRange5 = sheet.getRange("M4:M35");
let formatnumber = [];
let formatnumberitem = ["###,0"];
for (let i = 4; i < 36; i++) {
formatnumber.push(formatnumberitem);
}
numRange1.numberFormat = formatnumber;
numRange2.numberFormat = formatnumber;
numRange3.numberFormat = formatnumber;
numRange4.numberFormat = formatnumber;
numRange5.numberFormat = formatnumber;
sheet.activate();
//sheet.gridlines = false;
if (Office.context.requirements.isSetSupported("ExcelApi", 1.2)) {
sheet.getUsedRange().format.autofitColumns();
sheet.getUsedRange().format.autofitRows();
}
//sheet.onDataChanged.add(onDataChanged);
await context.sync();
});
}
catch (error) {
OfficeHelpers.UI.notify(error);
OfficeHelpers.Utilities.log(error);
}
}
async function CleanCharts() {
await Excel.run(async (context) => {
var charts = context.workbook.worksheets.getActiveWorksheet().charts;
charts.load("count");
await context.sync();
var chartCount = charts.count;
for (var i = 0; i < chartCount; i++){
charts.getItemAt(0).delete();
}
});
}
async function createReport() {
console.log("entered here");
await Excel.run(async (context) => {
var pageLayout = context.workbook.worksheets.getActiveWorksheet().pageLayout;
pageLayout.headersFooters.defaultForAllPages.centerHeader = "&B&36 My Little Shop Sales Report";
pageLayout.headersFooters.defaultForAllPages.rightFooter = "&B&36&P";
pageLayout.setPrintArea("A1:N90");
context.workbook.worksheets.getActiveWorksheet().horizontalPageBreaks.add("A37");
context.workbook.worksheets.getActiveWorksheet().horizontalPageBreaks.add("A71");
pageLayout.paperSize = "Legal";
pageLayout.orientation = "Landscape"
pageLayout.centerHorizontally = true;
pageLayout.printGridlines = false;
pageLayout.setPrintMargins(Excel.PrintMarginUnit.inches, { left: 1, right: 1 });
pageLayout.zoom = { scale: 75 };
pageLayout.headersFooters.useSheetScale = true;
await context.sync();
console.log("Report REady");
});
}
/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
try {
await callback();
}
catch (error) {
OfficeHelpers.UI.notify(error);
OfficeHelpers.Utilities.log(error);
}
}
language: typescript
template:
content: "<button id=\"addSampleData\" class=\"ms-Button\">\n <span class=\"ms-Button-label\"> Add Sample Data</span>\n</button>\n<h3>\n Sales Chart\n</h3>\n\n<button id=\"CreateLineChart\" class=\"ms-Button\">\n <span class=\"ms-Button-label\"> 1. Create Line Chart</span>\n</button>\n<p></p>\n<button id=\"SplitCharts\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">2. Split Charts</span>\n</button>\n<p></p>\n<button id=\"SyncAxis\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">3. Sync Axis </span>\n</button>\n<p></p>\n<button id=\"FormatAxis\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">4. Format Axis </span>\n</button>\n<p></p>\n<button id=\"SecondaryAxis\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">5. Secondary Axis </span>\n</button>\n<p></p>\n<button id=\"SetFormat\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">6. Set Format</span>\n</button>\n<h3>\n\tOther Analysis\n</h3>\n<button id=\"InvertColor\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">Sales Change</span>\n</button>\n<p></p>\n<button id=\"AddXYChart\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">Sales Base on Tempreture</span>\n</button>\n<p></p>\n<button id=\"ChangeDataLabels\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">Sales Base on Leaflets</span>\n</button>\n<h3>\n\tClear Charts\n</h3>\n<button id=\"CleanCharts\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">Clear Charts</span>\n</button>\n\n<h3>\n\tPrepare Report\n</h3>\n<button id=\"report\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">Prepare Report</span>\n</button>\n"
language: html
style:
content: |
/* Your style goes here */
language: css
libraries: |
https://appsforoffice.microsoft.com/lib/beta/hosted/office.js
https://appsforoffice.microsoft.com/lib/beta/hosted/office.d.ts
office-ui-fabric-js@1.4.0/dist/css/fabric.min.css
office-ui-fabric-js@1.4.0/dist/css/fabric.components.min.css
core-js@2.4.1/client/core.min.js
@types/core-js
@microsoft/office-js-helpers@0.7.4/dist/office.helpers.min.js
@microsoft/office-js-helpers@0.7.4/dist/office.helpers.d.ts
jquery@3.1.1
@types/jquery
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment