Call InitColumns from Toolbar Button

Hi All - I currently have a JS script which I'm using to read data from a CSV file, then to add additional columns to the lister using the filename as a lookup. The CSV is loaded into a Map down the chain from the OnAddColumns method.

Its possible that the user will modify the CSV file, at which point I want to be able to trigger the script to reload the CSV into the Map. From within the script I can call "Script.InitColumns".

Is there a way for me to call the scripts "InitColumns" method from a button on the toolbar? I've tried to create a new internal command "ToolRefresh" using the following code - but it hasn't worked and I'm not convinced this is the best way, despite it showing up in the command editor 'command' dropdown.

function OnAddCommands(addCmdData)
	var cmd = addCmdData.AddCommand(); = "ToolRefresh";
	cmd.method = "OnExternalRefresh";
	cmd.desc = "Refresh the data file loaded into Tool";
	cmd.label = "ToolRefresh";

function OnExternalRefresh(scriptCmdData) {

That code looks correct, as long as it is part of the same script that adds the columns.

Have you tried adding some DOpus.Output logging into the command function to confirm it is being called, and into the column init function to check it is then called as a result?

Can we see the code which adds the columns?

Thank you Leo. I do have logging at the start of all functions so I know when they've been fired. Here is some more information and some stripped out code (notably the csv to array function is missing).

The command which powers the 'refresh manually' button. Note that the command 'AToolRefresh' has made it into the command dropdown

This output shows the tool initialising when enabled, then the columns being build after an F5. This is followed by an error when the above button is pressed.

 11/02/2018 09:03 ATool.js:  # fnc_OnInit
 11/02/2018 09:03 ATool.js:  # fnc_OnAddCommands
 11/02/2018 09:03 ATool.js:  # fnc_OnAddColumns
 11/02/2018 09:03 ATool.js:  # fnc_loadOverlay
 11/02/2018 09:03 ATool.js:  CSV Load Successful: (C:\Users\XXXX\Dropbox\Scripting\opus_For.csv)
 11/02/2018 09:03 ATool:  # fnc_OnBeforeFolderChange
 11/02/2018 09:03 ATool:  # fnc_BuildColumns
 11/02/2018 09:03 ATool:  # fnc_BuildColumns
 11/02/2018 09:03 ATool:  # fnc_BuildColumns
 11/02/2018 09:03  Error at line 2, position 1
 11/02/2018 09:03  'AToolRefresh' is undefined (0x800a1391)

The main script body is here:

// Init the script
function OnInit(initData) {
	DOpus.OutputString("# fnc_OnInit"); = "ATool";
    initData.desc = "Allows the insertion of meta data as additional columns.";
	initData.log_prefix = "ATool";
    initData.default_enable = true;
	initData.config_desc = DOpus.NewMap();
	initData.config_desc("OverlayDataFile") = "Path to the overlay data file.";
	initData.config.OverlayDataFile = "";
	initData.config_desc("RefreshDataOnNavigation") = "Should the overlay data file reload every time you navigate or refresh the lister? (Not recommended for large data files).";
	initData.config.RefreshDataOnNavigation = false;
// Called to add our columns
function OnAddColumns(addColData){
	DOpus.OutputString("# fnc_OnAddColumns");
	// Load gMap 
	if(DOpus.TypeOf(Script.vars.get("gmMap")) == "bool" && Script.vars.get("gmMap") == false){
		DOpus.OutputString("ATool is Exiting", true);
	// For each column, set up function 
	for(var i = 1; i<h.length; i++){
			var cmd = addColData.AddColumn(); = h[i];
			cmd.method = "BuildColumns";
			cmd.label = h[i];
			cmd.autogroup = false;  
			cmd.autorefresh = true;  
			cmd.justify = "left";

// Load overlay data from source file and return as reference map 
function loadOverlay(){
	DOpus.OutputString("# fnc_loadOverlay");
	// Global map to hold our overlay data in
	var ggMap = DOpus.Create.Map();
	// Init file system object
	var fso = new ActiveXObject("Scripting.FileSystemObject");
	// Where are we grabbing the overlay from?
		var fStream =  fso.OpenTextFile(Script.config.OverlayDataFile, 1); // RO
		DOpus.OutputString("CSV Load Successful: (" + Script.config.OverlayDataFile + ")");
		DOpus.OutputString("Data File Load Failed: (" + Script.config.OverlayDataFile + ")", true);
		return false;
	// Grab the header and present
	h = csvToArr(fStream.ReadLine());
	h = h[0];
	// Load main CSV body data
	csvArray = csvToArr(fStream.ReadAll());

	// For each line in the overlay text file (Excluding header)
	for(var i = 0; i < csvArray.length; i++){
		// Create a temporary map to contain all pairs of column > value for this line  
		var lMap = DOpus.Create.Map();
		// Get current line (i = row number)
		var lineSplit = csvArray[i];
		// Process the columns
		for(var ii = 1; ii<h.length; ii++){
				// Add current column pairing to current line buffer 
		// Save line to global map with filename as index
	// Tidy up after yourself
	return ggMap;

// Called per line per column
function BuildColumns(scriptColData) {
	DOpus.OutputString("# fnc_BuildColumns");
	gMap = Script.vars.get("gmMap");
    if (scriptColData.item.is_dir) {
        scriptColData.value = "";
        scriptColData.sort = 1; = "Directory";

  		pk =;
			scriptColData.value = gMap(pk)(scriptColData.col);
			scriptColData.value = "";

function OnBeforeFolderChange(BeforeFolderChangeData){
	DOpus.OutputString("# fnc_OnBeforeFolderChange");
	if(Script.config.RefreshDataOnNavigation == true){
		DOpus.OutputString("# fnc_BeforeFolderChange - Refreshing");

function OnAddCommands(addCmdData) 
	DOpus.OutputString("# fnc_OnAddCommands");
	var cmd = addCmdData.AddCommand(); = "AToolRefresh";
	cmd.method = "OnExternalRefresh";
	cmd.desc = "Refresh the data file loaded into Tool";
	cmd.label = "AToolRefresh";

function OnExternalRefresh(scriptCmdData) {
	DOpus.OutputString("# fnc_OnExternalRefresh");

Take out the first line from the command button (@script JScript).

Thank you Jon! I think that got added in when I switched the 'function' of the command over from 'Script' and I didn't know any better to remove it.

Frustrating to know I was so close.

1 Like