private void OnGUI()
        {
            DatablockManager datablockManager = DatablockManager.Instance;

            EditorGUILayout.HelpBox("Export your data in CSV format. Can be imported into a Google sheets, Excel, and other spreadsheet porgrams.", MessageType.None);
            List <Type> types = DatablockList.GetInstances(typeof(Datablock));

            if (types.Count == 0)
            {
                EditorGUILayout.LabelField("No datablock types found");
                return;
            }

            datablockTypeIndex = EditorGUILayout.Popup("Choose datablock type", datablockTypeIndex, types.Select(d => d.ToString()).ToArray());
            Type datablockType = types[datablockTypeIndex];

            string exportLabel = exportData ? "Export " + datablockManager.GetDatablocks(datablockType).Count() + " datablocks" : "Export schema";

            GUI.backgroundColor = new Color(0, 0.8f, 0);

            if (GUILayout.Button(exportLabel))
            {
                string saveLocation = EditorUtility.SaveFilePanel("Export datablocks", "", datablockType.Name.ToString() + "s" + ".csv", "csv");
                if (!string.IsNullOrEmpty(saveLocation))
                {
                    ExportDatablocks(datablockType, saveLocation);
                }
            }

            GUI.backgroundColor = new Color(1, 1, 1);

            EditorGUILayout.Separator();

            showExportOptions = EditorGUILayout.Foldout(showExportOptions, "Export options");

            if (showExportOptions)
            {
                EditorGUI.indentLevel = 1;

                fieldDelimiter   = EditorGUILayout.TextField("Field delimiter", fieldDelimiter);
                exportData       = EditorGUILayout.Toggle("Export data", exportData);
                exportFullValues = EditorGUILayout.Toggle(new GUIContent("Include full values", "Exports the full value of a field even if it inherits its value."), exportFullValues);
            }
        }
        private void ShowExportUI()
        {
            DatablockManager datablockManager = DatablockManager.Instance;

            EditorGUILayout.HelpBox("Export datablocks of the selected type to a Google sheet. Select the worksheet you want to export to. Note: All exiting data on the first sheet will be overwritten.", MessageType.None);

            EditorGUILayout.BeginHorizontal();

            GUI.backgroundColor = new Color(0, 0.8f, .8f);

            if (GUILayout.Button("Refresh Spreesheets"))
            {
                spreadsheetEntries.Clear();

                var query = new SpreadsheetQuery();

                SpreadsheetFeed feed = null;
                try
                {
                    feed = sheetsAPI.Service.Query(query);
                }
                catch (Exception)
                {
                    Debug.LogError("OAuth error");
                    sheetsAPI.ClearOAuthToken();
                    throw;
                }

                // Iterate through all of the spreadsheets returned
                foreach (SpreadsheetEntry entry in feed.Entries)
                {
                    spreadsheetEntries.Add(entry);
                }
            }

            GUI.backgroundColor = new Color(1f, 0.2f, .4f);

            if (GUILayout.Button("Clear OAuth token"))
            {
                sheetsAPI.ClearOAuthToken();
            }

            GUI.backgroundColor = Color.white;


            EditorGUILayout.EndHorizontal();

            var options = new List <string>(spreadsheetEntries.Select(s => s.Title.Text));

            if (spreadsheetEntries.Count == 0)
            {
                options.Insert(0, "No spreadsheets found");
            }
            else
            {
                options.Insert(0, "Select");
            }

            if (spreadsheetIndex >= options.Count)
            {
                spreadsheetIndex = 0;
            }

            int tempSpreadsheetIndex = EditorGUILayout.Popup("Select spreedsheet", spreadsheetIndex, options.ToArray());

            if (tempSpreadsheetIndex != spreadsheetIndex)
            {
                canBeExported = false;

                spreadsheetIndex = tempSpreadsheetIndex;

                if (spreadsheetIndex != 0)
                {
                    DatablockManager.Instance.RefreshAssets();

                    spreadsheet = spreadsheetEntries.FirstOrDefault(s => s.Title.Text == options[spreadsheetIndex]);

                    if (spreadsheet.Worksheets.Entries.Count == 0)
                    {
                        Debug.LogError("Spreadsheet has no worksheet. Please add a worksheet to use this spreadsheet.");
                        return;
                    }

                    canBeExported = true;
                }
            }

            if (spreadsheetIndex != 0 && canBeExported)
            {
                List <Type> types = DatablockList.GetInstances(typeof(Datablock));

                datablockTypeIndex = EditorGUILayout.Popup("Choose datablock type", datablockTypeIndex, types.Select(d => d.ToString()).ToArray());
                Type datablockType = types[datablockTypeIndex];


                GUI.backgroundColor = new Color(0, 0.8f, 0);
                string exportLabel = exportData ? "Export " + datablockManager.GetDatablocks(datablockType).Count() + " datablocks" : "Export schema";

                if (GUILayout.Button(exportLabel))
                {
                    ExportDatablocks(datablockType);
                }

                GUI.backgroundColor = Color.white;
                EditorGUILayout.HelpBox("All data on the first sheet will be overwritten.", MessageType.Warning);
            }

            showExportOptions = EditorGUILayout.Foldout(showExportOptions, "Export options");

            if (showExportOptions)
            {
                EditorGUI.indentLevel = 1;

                exportData       = EditorGUILayout.Toggle("Export data", exportData);
                exportFullValues = EditorGUILayout.Toggle(new GUIContent("Include full values", "Exports the full value of a field even if it inherits its value."), exportFullValues);
            }
        }