# Difference between revisions of "Sheet Worker Snippets"

## Auto-calculating Attributes

### Example 1

(credit: Rabulias)

Your best bet would be to avoid the autocalc fields entirely if you can. Monitor the two other fields and when they change, have a sheetworker that adds them up to the new value. Then you can refer to the new value in other calculations much easier.

```on("sheet:opened change:stat_a change:stat_b", function() {
getAttrs(["stat_a", "stat_b"], function(values) {
setAttrs({
"foo_modchars": parseInt(values["stat_a"],10) || 0 + parseInt(values["stat_b"],10) || 0
});
});
});
```

### Example 2

(credit: GiGs)

I remember seeing a script someone wrote to allow you to use autocalc fields within sheet workers, but it's just simpler to use Rabulias's approach(see example 1 above).

Add the relevant stats to the on(change:) line, and duplicate the calculation within the sheet worker.

I generally don't put my working in the setattrs call, but before it so i can more easily check it. Something like

```on("sheet:opened change:stat_a change:stat_b", function() {
getAttrs(["stat_a", "stat_b"], function(values) {
var stat_a = parseInt(values["stat_a"],10)||0;
var stat_b = parseInt(values["stat_b"],10)||0;
var output = stat_a + stat_b;
setAttrs({
"foo_modchars": output
});
});
});
```

## Helper Functions

This section is for useful functions that aren't complete sheet workers, but are useful to use in sheet workers.

### Function: parseValues

(credit: GiGs) Many sheet workers have a bunch of lines like this:

```      var stat_a = parseInt(values["stat_a"],10)||0;
var stat_b = parseInt(values["stat_b"],10)||0;
```

You might also have lines like this:

```setAttrs({
"foo_modchars": parseInt(values["stat_a"],10) || 0 + parseInt(values["stat_b"],10) || 0
});
```

It gets tedious typing out all that. With the function below, you would instead write them as:

```var stat_a = parseValues("stat_a");
var stat_b = parseValues("stat_b");
setAttrs({
"foo_modchars": parseValues("stat_a") + parseValues("stat_b")
});
```

I think that's a lot easier to read. Here's the function:

#### parseValues

Place this at the start of your script block, and you'll be able to use it in all your sheet workers.

```const parseValues = (values, stat, type='int') => {
if(type === 'int') return parseInt(values[stat],10)||0;
else if(type === 'float') return parseFloat(values[stat],10)||0;
else if(type === 'str') return values[stat];
};
```

By default, it returns an integer. If you call it with a second parameter, it will return either a float or a string:

• parseValues(values, stat) or parseValues(values, stat, 'int') - returns an integer.
• parseValues(values, stat,'float') - returns a Float (a number that is not an integer)
• parseValues(values, stat, 'str') - returns the value as text. (Not really needed!)

This function does handle variable attribute names. If you were in a loop and creating attributes like, "stat" + i it will work fine.