Javascript count scope issue - scope

for some reason whenever I call overlayChange() when it checks the condition of count it sets count to 24, executes the code inside. I'm trying to identify when the count = 24 then set it back to 0.
overlayChange() is an onclick function to a clickable span element on the webpage.
var count=0;
var name='HeatMap'.concat(count.toString());
var viewer = new Cesium.CesiumWidget('cesiumContainer');
var layers = viewer.scene.imageryLayers;
loadCesium();
function loadCesium()
{
//Cesium Active Window
layers.addImageryProvider(new Cesium.SingleTileImageryProvider({
url : 'images/'.concat(name.concat('.png')),
rectangle : Cesium.Rectangle.fromDegrees(-180.0, -90.0, 180.0, 90.0),
opacity:.3
}));
}
function overlayChange()
{
if(count = 24)
{
count = 0;
name='HeatMap';
name = name.concat(count.toString());
loadCesium();
}
else
{
name='HeatMap';
count=count+1;
name = name.concat(count.toString());
loadCesium();
}
}

Related

Dynamically add a new key and value to a global object in chrome extension pop up

I'm relatively new to objects in javascript. Currently I'm making a chrome extension where, in the background script, there is a counter that updates. In my popup file, I have a global variable that reads the background scripts counter and updates a variable in the popup file. Then I have a text analyzer that generates a number every page where the pop up is opened. Everytime the pop up opens I need the object to add a new key value pair - with the counter number as the key and value as the generated number (made through function getComparitive(), however on console.log I see none of the old key value pairs being saved. Just the current page one. Not sure if my syntax isn't correct. Is it because everytime the pop up opens it reloads and the older key value pairs are deleted?
Any ideas in technique and process would be helpful too.
background.js -
let previousUrl = null;
window.visitedSiteCount = 0;
chrome.webNavigation.onCompleted.addListener(function (e) {
if (e.url !== previousUrl) {
window.visitedSiteCount++;
previousUrl = e.url;
console.log(visitedSiteCount)
}
});
pop-up file -
let afinn;
let counts = {}
let keys = [];
let graphData = {}
let newParas;
let bgpage = chrome.extension.getBackgroundPage();
let siteCount;
function preload() {
afinn = loadJSON('afinn111.json');
}
function setup() {
noCanvas();
}
chrome.tabs.query({
active: true,
currentWindow: true
}, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
greeting: "hello"
}, function (response) {
if (response.containsPara === true) {
newParas = response.text.join(' ');
getComparitive(newParas)
}
});
});
function getComparitive(p) {
let words = p.replace(/[.,:!]/g, "").split(" ");
let totalScore = 0;
for (let i = 0; i < words.length; i++) {
let word = words[i].toLowerCase() // since all the words in data set are lowercase!
if (afinn.hasOwnProperty(word)) {
let score = afinn[word]
// check true or false if the the current word is present in dataset
totalScore += Number(score); // access value of each word in json obj & convert to a number
}
}
siteCount = bgpage.visitedSiteCount;
let comparitive = totalScore / words.length;
const comp = select('#comparative');
comp.html('comparative: ' + comparitive);
if (graphData[siteCount] === undefined) {
graphData[siteCount] = comparitive;
} else {}
}
console.log(graphData);

Unable to delete Mutiple Comp from listbox with Extendscript

I can't perform multiple delette from my listbox although I made the listbox mutiselect Why ??
I need your help . You can see the full Script down there.
(function(){
$.win = new Window("palette");
var win = $.win;
win.orientation = "column";
win.alignChildren = ["center", "top"];
win.spacing = 10;
win.margins = 16;
var listbox1 = win.add("listbox", undefined, undefined, { name: "listbox1", multiselect: true, columnTitles: "Max", showHeaders: true });
listbox1.preferredSize.width = 136;
listbox1.preferredSize.height = 208;
var button1 = win.add("button", undefined, undefined, { name: "button1" });
button1.text = "Search";
var button2 = win.add("button", undefined, undefined, { name: "button2" });
button2.text = "Delete";
win.show();
var myNewArray = [];
button1.onClick = function Search() {
var compsArray = new Array();
var myProj = app.project;
myNewArray = [];
listbox1.removeAll();
for (var i = 1; i <= myProj.numItems; i++) {
if (myProj.item(i) instanceof CompItem) {
myNewArray = compsArray[compsArray.length] = myProj.item(i);
listbox1.add("item", myNewArray.name);
}
}
}
button2.onClick = function deletecomps() {
for (var s = 1; s <= app.project.numItems; s ++) {
if ((app.project.item(s) instanceof CompItem) && (app.project.item(s).name.match(listbox1.selection))) {
myComp = app.project.item(s);
break;
}
}
app.project.item(s).remove ();
}
})();
You can see an image to clarify the script in AE
Your problem is that listbox1.selection in line 34
if ((app.project.item(s) instanceof CompItem) && (app.project.item(s).name.match(listbox1.selection))) {
is an array, and you're trying to match it to a string returned by app.project.item(s).name which is never going to match.
Also, what are you trying to achieve with the lines
myComp = app.project.item(s);
break;
Here's the onClick function, but it works. It loops through the selection, and looks for a matching project item, based on the text of the listbox matching the comp's name. This is dangerous, because identical comp names would create false positives. I strongly suggest you don't use this technique in production code, because it will definitely cause problems for your users.
Also I'd turn the part wherre you populate the list into a separate function, and call it after you click delete, so that the list is refreshed, because at the moment the list stays the same, even after the comp is deleted.
button2.onClick = function deletecomps() {
for (var b= 0; b < listbox1.selection.length; b++){
for (var s = 1; s <= app.project.numItems; s ++) {
if ((app.project.item(s) instanceof CompItem) && (app.project.item(s).name.match(listbox1.selection[b].text))) {
app.project.item(s).remove ();
}
}
}
}

Chrome.tabs.sendMessage is not sending a message to content script

I have looked at a lot of different posts about using execute script and send message to execute the content script on a specified tab, but it doesn't execute the content script until I do a hard refresh and then the response from the content script is successful. Attached below is the call back function for button clicked this is in a popup.js file.
function buttonClicked() {
// Get an object for the active tab
console.log("print dymo has been clicked");
chrome.tabs.query({active: true, currentWindow: true}, function(tab_array){
// send a messege to the contentscript that will then scrape the web
// it will then call the popup.js receiveURL() method with the url it makes
console.log("Messege sent to conntent script");
alert("print has been clicked")
alert(tab_array[0].id)
chrome.tabs.sendMessage(tab_array[0].id, {getHTML: true}, receiveURL);
});
Content Script:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
// When there is a request (that will come in as true)
if (request) {
/*********************************************************************
IF YOU NEED TO CHANGE THE WEB SCRAPER START HERE
**********************************************************************/
// Take out everything in the html before the tag "<label>Job:</label>"
// Selects only the inner elements between the style row
var matches = document.querySelectorAll('ul.list-unstyled')
//Gives us the inner text of the elements of information
//Gives us an array of all the information split up by new lines
information = matches[1].innerText.split(/\r?\n/)
//Iterate ansd store everything in a dictionary split by a :
var dict_info = {}
for (index = 0; index < information.length; index++) {
parts = information[index].split(": ")
ans = ""
for(i = 1; i < parts.length; i++) {
ans += parts[i]
}
dict_info[parts[0]] = ans
}
var name = dict_info['Requestor']
var job = dict_info['Job']
if (job != undefined) {
job = job.match(JOB_REGEX)[1]
}
var request = dict_info['Request']
if (request != undefined) {
request = request.match(REQ_REGEX)[1]
}
var file = dict_info["File"]
if (file.length > 10) {
file = file.substring(0,file.length-9)
}
if (file.length > 20) {
file = file.substring(0, 20)
}
var email = dict_info['Requestor Email']
var cost = dict_info['Estimated Cost']
if(cost == undefined) {
cost = dict_info['Cost']
}
if (cost != undefined) {
cost = cost.match(COST_REGEX)[1]
}
name = name.split(" ")
name = name[0] + "/" + name[name.length-1]
var url = "https:// test"
sendResponse(url);
return true;
}
}
);

Not generating expected results between google calendar and spreadsheet

So I have some code to create calendar events based on a jobs sheet for meetings but I can't seem to get it working as I would expect- I have columns 24 and 25 to keep track of if its been put in the calendar and the calendar event id, I don't want it to delete then create a new event for ones that have already been added (as this spreadsheet can get large) so thats why I keep track via on edit. But is seems to create a new event every time. If anyone can have a look over that would be great as I've been struggling for the past 3 days with this.
Many thanks
//push new events to calendar;
function pushToCalendar() {
//spreadsheet variables
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();
var range = sheet.getRange(2,1,lastRow,26);
var values = range.getValues();
var updateRange = sheet.getRange('Z1');
//calendar variables
var calendar = CalendarApp.getCalendarById('insert calendar code here')
//show updating message
updateRange.setFontColor('red');
var numValues = 0;
for (var i = 0; i < values.length; i++) {
//check to see if name are filled out
if ((values[i][0].length > 0) && (values[i][1].length > 0)) {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// if it has been edited delete old event
if (values[i][23] ='n') {
try{
var eventIdCell =values[i][24];
var eventId =calendar.getEventSeriesById(eventIdCell);
eventId.deleteEventSeries();
}
catch (e) {
// do nothing - we just want to delete if it has been edited and the old event if it still exists
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//check if it's been entered before
if (values[i][23] !='y') {
var newEventTitle = values[i][0] + ' - ' + values[i][1]+' - ' + 'Sample';
var newEvent = calendar.createAllDayEvent(newEventTitle, new Date(values[i][6]));
//get ID
var newEventId = newEvent.getId();
//mark as entered, enter ID
sheet.getRange(i+2,24).setValue('y');
sheet.getRange(i+2,25).setValue(newEventId);
}
}
numValues++;
}
//hide updating message
updateRange.setFontColor('white');
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//add a menu when the spreadsheet is opened
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [];
menuEntries.push({name: "Update Calendar", functionName: "pushToCalendar"});
sheet.addMenu("Jobs Calendar", menuEntries);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
function onEdit(event){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var actSht = event.source.getActiveSheet();
var actRng = event.source.getActiveRange();
var activeCell = actSht.getActiveCell();
var row = activeCell.getRow();
if(row < 2){
return; //If header row then return
}
else{
var index = actRng.getRowIndex();
var updateCalCell = actSht.getRange(index,24);
var eventIdCell = actSht.getRange(index,25);
change updated on colander status to n
updateCalCell.setValue('n');
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
You made a simple error in the condition : the EQUAL operator in comparison is == and not =, change that and it will work.
if (values[i][23] =='n') {

Dropdown field - first item should be blank - For more than one field (Sharepoint)

I was looking for a solution to the problem of getting a blank default when using a lookup in a field in Sharepoint. Kit Menke's solution to "Dropdown field - first item should be blank" question works perfectly for my first field with a lookup. But I can't make it work if have more that one field in the same list where I need to insert a blank for each lookup field (works only for the first field). I tried adding a new "Web Part" and applying the same code to the second field, but doesn't work. Any ideas? Thanks in advance
Follow-up to my answer here: Dropdown field - first item should be blank
Version 2.0 allows you to add the names of your dropdowns to dropdownNames in the MyCustomExecuteFunction function. As with the first one, this will work only with required single select lookup fields. Also, in order to edit the page again and update your Content Editor Web Part you may have to choose a value for your dropdowns otherwise you get the dreaded An unexpected error has occurred.. Good luck! :D
<script type="text/javascript">
function GetDropdownByTitle(title) {
var dropdowns = document.getElementsByTagName('select');
for (var i = 0; i < dropdowns.length; i++) {
if (dropdowns[i].title === title) {
return dropdowns[i];
}
}
return null;
}
function GetOKButtons() {
var inputs = document.getElementsByTagName('input');
var len = inputs.length;
var okButtons = [];
for (var i = 0; i < len; i++) {
if (inputs[i].type && inputs[i].type.toLowerCase() === 'button' &&
inputs[i].id && inputs[i].id.indexOf('diidIOSaveItem') >= 0) {
okButtons.push(inputs[i]);
}
}
return okButtons;
}
function AddValueToDropdown(oDropdown, text, value, optionnumber){
var options = oDropdown.options;
var option = document.createElement('OPTION');
option.appendChild(document.createTextNode(text));
option.setAttribute('value',value);
if (typeof(optionnumber) == 'number' && options[optionnumber]) {
oDropdown.insertBefore(option,options[optionnumber]);
}
else {
oDropdown.appendChild(option);
}
oDropdown.options.selectedIndex = 0;
}
function WrapClickEvent(element, newFunction) {
var clickFunc = element.onclick;
element.onclick = function(event){
if (newFunction()) {
clickFunc();
}
};
}
function MyCustomExecuteFunction() {
// **** ADD YOUR REQUIRED SINGLE SELECT FIELDS HERE ***
var dropdownNames = [
'Large Lookup Field',
'My Dropdown Field'
];
var dropdownElements = [];
for (var d = 0; d < dropdownNames.length; d++) {
// find the dropdown
var dropdown = GetDropdownByTitle(dropdownNames[d]);
// comment this IF block out if you don't want an error displayed
// when the dropdown can't be found
if (null === dropdown) {
alert('Unable to get dropdown named ' + dropdownNames[d]);
continue;
}
AddValueToDropdown(dropdown, '', '', 0);
// collect all of our dropdowns
dropdownElements.push(dropdown);
}
// add a custom validate function to the page
var funcValidate = function() {
var isValid = true;
var message = "";
for (var d = 0; d < dropdownElements.length; d++) {
if (0 === dropdownElements[d].selectedIndex) {
// require a selection other than the first item (our blank value)
if (isValid) {
isValid = false;
} else {
message += "\n"; // already had one error so we need another line
}
message += "Please choose a value for " + dropdownNames[d] + ".";
}
}
if (!isValid) {
alert(message);
}
return isValid;
};
var okButtons = GetOKButtons();
for (var b = 0; b < okButtons.length; b++) {
WrapClickEvent(okButtons[b], funcValidate);
}
}
_spBodyOnLoadFunctionNames.push("MyCustomExecuteFunction");
</script>
How about prepending a null option to the select menu of sharepoint.Like,
$('#idOfSelectMenu').prepend('<option value="" selected>(None)</option>');
I used this approach and append this code only in the NewForm.aspx because in EditForm.aspx it will override the selected option.

Resources