doo.environment
currentApplication
Information about the current application. It contains the application ID, name, header, parameters, and information about the currently opened table.
doo.environment.currentApplication
const currentApplication = doo.environment.currentApplication;
console.log(currentApplication);You can use it to get basic information about the current application.
Get the current application ID:
const appId = doo.environment.currentApplication.id;
console.log(appId); // "11111-0612-476b-b211-5512f49b1111"Get the current application name:
const appName = doo.environment.currentApplication.name;
console.log(appName); // tabidooGet the current application header:
const appHeader = doo.environment.currentApplication.header;
console.log(appHeader); // "Tabidoo"Get application parameters:
const params = doo.environment.currentApplication.params;
console.log(params); // {parameters: {name: "Test app",number: 1000}}Get a specific application parameter:
const parameterName = doo.environment.currentApplication.params.parameters.name;
const parameterNumber = doo.environment.currentApplication.params.parameters.number;
console.log(parameterName); // "Test app"
console.log(parameterNumber); // 1000The currentApplication object also contains information about the table that is currently opened in the application.
doo.environment.currentApplication.currentTable
const currentTable = doo.environment.currentApplication.currentTable;
console.log(currentTable);You can use the current table to get its ID, name, header, currently selected records, and the current user data filter.
Get the current table ID:
const tableId = doo.environment.currentApplication.currentTable.id;
console.log(tableId); // "xxx39972-0762-4913-97cb-a93db2a2xxxx"Get the current table name:
const tableName = doo.environment.currentApplication.currentTable.name;
console.log(tableName); // companyGet the current table header:
const tableHeader = doo.environment.currentApplication.currentTable.header;
console.log(tableHeader); // CompanyOn the currently opened table, you can get a list of currently selected records in the grid view or card view.
doo.environment.currentApplication.currentTable.selectedRecords
const selectedRecords = doo.environment.currentApplication.currentTable.selectedRecords;
console.log(selectedRecords); // [{id: "xxx670b8-1480-4340-9551-05b72bfb9xxx",ver: 0,number: {value: 3000},date:value: "2026-06-17"}}]Get the number of selected records:
const selectedRecords = doo.environment.currentApplication.currentTable.selectedRecords ?? [];
console.log(selectedRecords.length); // 1You can also get the current user data filter from the currently opened table.
doo.environment.currentApplication.currentTable.dataConditions
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;
console.log(dataConditions); // {filter: [{field: "number",operator: "gt",value: "1000",values: null}],filterOperator: "and",fullText: undefined}The current user data filter can be used to retrieve filtered table data using methods such as doo.table.getData, doo.table.getCount, doo.table.getDataSummary, and other methods supporting data conditions.
Get the number of records matching the current user data filter:
const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;
const count = await doo.table.getCount(tableId, dataConditions);
console.log(count); // {data: {count: 2}}Get only the count value:
const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;
const count = await doo.table.getCount(tableId, dataConditions);
console.log(count.data.count); // 2Get records matching the current user data filter:
const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;
const records = await doo.table.getData(tableId, {
filter: dataConditions
});
console.log(records); // {data: [{id: "xxx670b8-1480-4340-9551-05b72bfb9xxx",created: "2026-06-01T06:51:12.878Z",modified: "2026-06-01T06:51:12.878Z",ver: 0,fields: {number: 3000,date: "2026-06-17"}}Get only returned records:
const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;
const records = await doo.table.getData(tableId, {
filter: dataConditions
});
console.log(records.data);isPublicDashboard
The Tabidoo app can publish a dashboard without the need to log in. For example, to a company website. With this property, you can easily detect this state and modify the behavior in the code.
isPublicForm
The Tabidoo app can also use a public form to collect data. Without the need to log in. For example, from a public company website. With this property, you can easily detect this state and modify the behavior on the form.
queryParam
If the public form was run with parameters in the query string, here are their keys and values.
isServer
Whether the JavaScript code is running on the client side or on the server side.
getCurrentUserTechnicalLimits
await doo.environment.getCurrentUserTechnicalLimits();
returns information about the technical limits that the current user (as the application owner) has consumed.
- Limits that have not been touched are not included in the response list.
- For example, if no workflow has run on a given day, workflow-related limits will not appear.
- If a limit is reported as
0, it is currently not actively enforced β the value is only logged and may be evaluated in the future.
Example Response
[
{
"value": 61183,
"limit": 1800000,
"type": "workflowRunsMs",
"userLimitTimeUnit": "day",
"userLimitValueUnit": "milliseconds"
},
{
"value": 876,
"limit": 10000,
"type": "getDataResponseCharsMB",
"userLimitTimeUnit": "day",
"userLimitValueUnit": "count"
},
{
"value": 122077,
"limit": 0,
"type": "getDataResponseElapsedMs",
"userLimitTimeUnit": "day",
"userLimitValueUnit": "milliseconds"
},
{
"value": 27,
"limit": 10000,
"type": "workflowRunsCount",
"userLimitTimeUnit": "day",
"userLimitValueUnit": "count"
} ] Field Descriptions
- value β the current consumption for the given metric.
- limit β the allowed maximum for that metric. (
0= not enforced, only tracked). - type β the type of operation being measured (e.g.,
workflowRunsMs,workflowRunsCount,getDataResponseElapsedMs). - userLimitTimeUnit β the time window for the limit (e.g.,
day,hour). - userLimitValueUnit β the unit of measurement (e.g.,
milliseconds,count).
Possible Limit Types
The method may return different types of limits depending on what features are used.
Each limit can be tracked in different time windows β most commonly daily and hourly, in some cases even per minute.
Workflow
- workflowRunsMs β total workflow execution time (milliseconds).
- workflowRunsCount β number of workflow executions.
API / Data
- getDataResponseCharsMB β total size of data returned by
getDatarequests (megabytes). - getDataResponseElapsedMs β total response time for
getDatarequests (milliseconds). - getAttachmentResponseCharsMB β total size of attachments returned by API requests (megabytes).
- emailsPerRecipientCount β number of emails sent per recipient.
The same limit type may appear multiple times with different time windows (e.g.
day,hour, orminute).
Example Use Cases
- Quick Inspection
Run the method directly in any script to see the current usage values. - Daily Logging
Create a workflow that calls this method every hour and stores results in a table.
This allows you to build graphs, alerts, or daily summaries. - Logging on Workflow Completion
After a workflow finishes, log the values together with metadata (e.g., which workflow has completed). - Alerting on Threshold Breach
Build a workflow that checks limits hourly.
If consumption is close to the threshold (e.g., 80%), send yourself an email alert.
This gives you time to upgrade your Tabidoo plan before limits are exceeded.