SheetModifiedTrigger
Poll for Google Sheet modifications
SheetModifiedTrigger
Poll for Google Sheet modifications
yaml
type: io.kestra.plugin.googleworkspace.sheets.SheetModifiedTriggerExamples
yaml
id: monitor_spreadsheet
namespace: company.team
tasks:
- id: log_changes
type: io.kestra.plugin.core.log.Log
message: |
{% if trigger.count > 0 %}
Spreadsheet '{{ trigger.modifications[0].spreadsheetTitle }}' was modified by {{ trigger.modifications[0].lastModifyingUser }}.
Detected {{ trigger.count }} modification(s).
{% else %}
No modifications detected in spreadsheet.
{% endif %}
triggers:
- id: watch_sheet
type: io.kestra.plugin.googleworkspace.sheets.SheetModifiedTrigger
interval: PT5M
spreadsheetId: "1U4AoiUrqiVaSIVcm_TwDc9RoKOdCULNGWxuC1vmDT_A"
serviceAccount: "{{ secret('GCP_SERVICE_ACCOUNT_JSON') }}"
yaml
id: monitor_orders_sheet
namespace: company.team
tasks:
- id: process_changes
type: io.kestra.plugin.core.debug.Return
format: |
{% if trigger.count > 0 %}
Changes detected in sheet:
- Modified at: {{ trigger.modifications[0].modifiedTime }}
- Modified by: {{ trigger.modifications[0].lastModifyingUser }}
- Revision ID: {{ trigger.modifications[0].revisionId }}
{% else %}
No modifications detected in Orders sheet.
{% endif %}
triggers:
- id: watch_orders
type: io.kestra.plugin.googleworkspace.sheets.SheetModifiedTrigger
interval: PT2M
spreadsheetId: "1U4AoiUrqiVaSIVcm_TwDc9RoKOdCULNGWxuC1vmDT_A"
serviceAccount: "{{ secret('GCP_SERVICE_ACCOUNT_JSON') }}"
sheetName: "Orders"
includeDetails: true
yaml
id: track_new_revisions
namespace: company.team
tasks:
- id: notify
type: io.kestra.plugin.notifications.slack.SlackIncomingWebhook
url: "{{ secret('SLACK_WEBHOOK') }}"
payload: |
{
"text": "{% if trigger.count > 0 %}Spreadsheet '{{ trigger.modifications[0].spreadsheetTitle }}' was modified by {{ trigger.modifications[0].lastModifyingUser }}{% else %}No changes detected{% endif %}"
}
triggers:
- id: watch
type: io.kestra.plugin.googleworkspace.sheets.SheetModifiedTrigger
interval: PT1M
spreadsheetId: "{{ vars.spreadsheet_id }}"
serviceAccount: "{{ secret('GCP_SERVICE_ACCOUNT_JSON') }}"
on: CREATE
includeDetails: true
Properties
spreadsheetId *Requiredstring
allowConcurrent Non-dynamicboolean
Default
falseconditions Non-dynamic
Definitions
Allow events only between two datetimes.
Example
yaml
id: schedule_condition_datetimebetween
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute once every 5 minutes after the date 2025-12-31T23:59:59Z"
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "*/5 * * * *"
conditions:
- type: io.kestra.plugin.core.condition.DateTimeBetween
date: "{{ trigger.date }}"
after: "2025-12-31T23:59:59Z"
yaml
id: schedule_condition_datetimebetween
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will be executed once every 5 minutes between the before and after dates"
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "*/5 * * * *"
conditions:
- type: io.kestra.plugin.core.condition.DateTimeBetween
date: "{{ trigger.date }}"
after: "2025-01-01T00:00:00Z"
before: "2025-12-31T23:59:59Z"
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.DateTimeBetweenio.kestra.core.models.conditions.types.DateTimeBetweenConditionio.kestra.plugin.core.condition.DateTimeBetweenConditionafterstring
beforestring
datestring
Default
{{ trigger.date }}Allow events on a specific weekday.
Example
yaml
id: schedule_condition_dayweek
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute only on Mondays at 11:00 am."
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "0 11 * * *"
conditions:
- type: io.kestra.plugin.core.condition.DayWeek
dayOfWeek: "MONDAY"
dayOfWeek*Requiredstring
Possible Values
MONDAYTUESDAYWEDNESDAYTHURSDAYFRIDAYSATURDAYSUNDAYtype*Requiredobject
Possible Values
io.kestra.plugin.core.condition.DayWeekio.kestra.core.models.conditions.types.DayWeekConditionio.kestra.plugin.core.condition.DayWeekConditiondatestring
Default
{{ trigger.date }}Allow events on an nth weekday within the month.
Example
yaml
id: schedule_condition_dayweekinmonth
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute only on the first Monday of the month at 11:00 am."
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "0 11 * * *"
conditions:
- type: io.kestra.plugin.core.condition.DayWeekInMonth
dayOfWeek: "MONDAY"
dayInMonth: FIRST
dayInMonth*Requiredstring
Possible Values
FIRSTLASTSECONDTHIRDFOURTHdayOfWeek*Requiredstring
Possible Values
MONDAYTUESDAYWEDNESDAYTHURSDAYFRIDAYSATURDAYSUNDAYtype*Requiredobject
Possible Values
io.kestra.plugin.core.condition.DayWeekInMonthio.kestra.plugin.core.condition.DayWeekInMonthConditionio.kestra.core.models.conditions.types.DayWeekInMonthConditiondatestring
Default
{{ trigger.date }}Match events from a specific flow.
Example
yaml
id: flow_condition_executionflow
namespace: company.team
tasks:
- id: hello
type: io.kestra.plugin.core.log.Log
message: "This flow will execute when flow `flow_a` of namespace `company.team` enters RUNNING state."
triggers:
- id: flow_trigger
type: io.kestra.plugin.core.trigger.Flow
conditions:
- type: io.kestra.plugin.core.condition.ExecutionFlow
flowId: flow_a
namespace: company.team
states:
- RUNNING
flowId*Requiredstring
namespace*Requiredstring
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.ExecutionFlowio.kestra.plugin.core.condition.ExecutionFlowConditionio.kestra.core.models.conditions.types.ExecutionFlowConditionMatch executions by label set.
Example
yaml
id: flow_condition_executionlabels
namespace: company.team
tasks:
- id: hello
type: io.kestra.plugin.core.log.Log
message: "This flow will execute when flow with specified labels enters FAILED state."
triggers:
- id: flow_trigger
type: io.kestra.plugin.core.trigger.Flow
conditions:
- type: io.kestra.plugin.core.condition.ExecutionLabels
labels:
owner: john.doe
env: prod
states:
- FAILED
labels*Requiredarrayobject
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.ExecutionLabelsio.kestra.core.models.conditions.types.ExecutionLabelsConditionio.kestra.plugin.core.condition.ExecutionLabelsConditionMatch executions by namespace.
Example
yaml
id: flow_condition_executionnamespace
namespace: company.team
tasks:
- id: hello
type: io.kestra.plugin.core.log.Log
message: "This flow will execute when any flow within `company.engineering` namespace enters RUNNING state."
triggers:
- id: flow_trigger
type: io.kestra.plugin.core.trigger.Flow
conditions:
- type: io.kestra.plugin.core.condition.ExecutionNamespace
namespace: company.engineering
comparison: PREFIX
states:
- RUNNING
namespace*Requiredstring
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.ExecutionNamespaceio.kestra.core.models.conditions.types.ExecutionNamespaceConditionio.kestra.plugin.core.condition.ExecutionNamespaceConditioncomparisonstring
Possible Values
EQUALSPREFIXSUFFIXprefixbooleanstring
Default
falseCondition based on the outputs of an upstream execution.
Example
yaml
id: flow_condition_executionoutputs
namespace: company.team
tasks:
- id: upstream_outputs
type: io.kestra.plugin.core.log.Log
message: hello from a downstream flow
triggers:
- id: condition_on_flow_execution_outputs
type: io.kestra.plugin.core.trigger.Flow
states:
- SUCCESS
conditions:
- type: io.kestra.plugin.core.condition.ExecutionOutputs
expression: "{{ trigger.outputs.flow_a_output == 'hello' }}"
expression*Requiredbooleanstring
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.ExecutionOutputsio.kestra.core.models.conditions.types.ExecutionOutputsConditionio.kestra.plugin.core.condition.ExecutionOutputsConditionMatch executions by status.
Example
yaml
id: flow_condition_executionstatus
namespace: company.team
tasks:
- id: hello
type: io.kestra.plugin.core.log.Log
message: "This flow will execute when any flow enters FAILED or KILLED state."
triggers:
- id: flow_trigger
type: io.kestra.plugin.core.trigger.Flow
conditions:
- type: io.kestra.plugin.core.condition.ExecutionStatus
in:
- FAILED
- KILLED
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.ExecutionStatusio.kestra.core.models.conditions.types.ExecutionStatusConditionio.kestra.plugin.core.condition.ExecutionStatusConditioninarray
SubTypestring
Possible Values
CREATEDSUBMITTEDRUNNINGPAUSEDRESTARTEDKILLINGSUCCESSWARNINGFAILEDKILLEDCANCELLEDQUEUEDRETRYINGRETRIEDSKIPPEDBREAKPOINTRESUBMITTEDnotInarray
SubTypestring
Possible Values
CREATEDSUBMITTEDRUNNINGPAUSEDRESTARTEDKILLINGSUCCESSWARNINGFAILEDKILLEDCANCELLEDQUEUEDRETRYINGRETRIEDSKIPPEDBREAKPOINTRESUBMITTEDCondition based on variable expression.
Example
yaml
id: myflow
namespace: company.team
tasks:
- id: hello
type: io.kestra.plugin.core.log.Log
message: Average value has gone below 10
triggers:
- id: expression_trigger
type: io.kestra.plugin.core.trigger.Schedule
cron: "*/1 * * * *"
conditions:
- type: io.kestra.plugin.core.condition.Expression
expression: "{{ kv('average_value') < 10 }}"
expression*Requiredstring
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.Expressionio.kestra.plugin.core.condition.ExpressionConditionio.kestra.core.models.conditions.types.VariableConditionMatch executions where a task was retried.
Example
yaml
id: flow_condition_hasretryattempt
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute when any flow task on retry enters a specific state(s)."
triggers:
- id: flow_condition
type: io.kestra.plugin.core.trigger.Flow
conditions:
- type: io.kestra.plugin.core.condition.HasRetryAttempt
in:
- FAILED
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.HasRetryAttemptio.kestra.plugin.core.condition.HasRetryAttemptConditionio.kestra.core.models.conditions.types.HasRetryAttemptConditioninarray
SubTypestring
Possible Values
CREATEDSUBMITTEDRUNNINGPAUSEDRESTARTEDKILLINGSUCCESSWARNINGFAILEDKILLEDCANCELLEDQUEUEDRETRYINGRETRIEDSKIPPEDBREAKPOINTRESUBMITTEDnotInarray
SubTypestring
Possible Values
CREATEDSUBMITTEDRUNNINGPAUSEDRESTARTEDKILLINGSUCCESSWARNINGFAILEDKILLEDCANCELLEDQUEUEDRETRYINGRETRIEDSKIPPEDBREAKPOINTRESUBMITTEDInvert one or more conditions.
Example
yaml
id: schedule_condition_not
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute on all days except Sunday at 11am."
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "0 11 * * *"
conditions:
- type: io.kestra.plugin.core.condition.Not
conditions:
- type: io.kestra.plugin.core.condition.DayWeek
dayOfWeek: "SUNDAY"
conditions*Required
Min items
1type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.Notio.kestra.core.models.conditions.types.NotConditionio.kestra.plugin.core.condition.NotConditionPass when any condition is true.
Example
yaml
id: schedule_condition_or
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute on Sundays and Mondays at 11am."
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "0 11 * * *"
conditions:
- type: io.kestra.plugin.core.condition.Or
conditions:
- type: io.kestra.plugin.core.condition.DayWeek
dayOfWeek: "MONDAY"
- type: io.kestra.plugin.core.condition.DayWeek
dayOfWeek: "SUNDAY"
conditions*Required
Min items
1type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.Orio.kestra.core.models.conditions.types.OrConditionio.kestra.plugin.core.condition.OrConditionAllow events on public holidays.
Example
yaml
id: schedule_condition_public-holiday
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute only on the public holidays of France at 11:00 am."
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "0 11 * * *"
conditions:
- type: io.kestra.plugin.core.condition.PublicHoliday
country: FR
yaml
id: schedule-condition-work-days
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute only on the work days of France at 11:00 am."
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "0 11 * * *"
conditions:
- type: io.kestra.plugin.core.condition.Not
conditions:
- type: io.kestra.plugin.core.condition.PublicHoliday
country: FR
- type: io.kestra.plugin.core.condition.Weekend
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.PublicHolidayio.kestra.plugin.core.condition.PublicHolidayConditionio.kestra.core.models.conditions.types.PublicHolidayConditioncountrystring
datestring
Default
{{ trigger.date}}subDivisionstring
Allow events between two times of day.
Example
yaml
id: schedule_condition_timebetween
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute every 5 minutes between 4pm and 8pm."
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "*/5 * * * *"
conditions:
- type: io.kestra.plugin.core.condition.TimeBetween
after: "16:00:00+02:00"
before: "20:00:00+02:00"
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.TimeBetweenio.kestra.plugin.core.condition.TimeBetweenConditionio.kestra.core.models.conditions.types.TimeBetweenConditionafterstring
beforestring
datestring
Default
{{ trigger.date }}Allow events on weekends.
Example
yaml
id: schedule_condition_weekend
namespace: company.team
tasks:
- id: log_message
type: io.kestra.plugin.core.log.Log
message: "This flow will execute only on weekends at 11:00 am."
triggers:
- id: schedule
type: io.kestra.plugin.core.trigger.Schedule
cron: "0 11 * * *"
conditions:
- type: io.kestra.plugin.core.condition.Weekend
type*Requiredobject
Possible Values
io.kestra.plugin.core.condition.Weekendio.kestra.plugin.core.condition.WeekendConditionio.kestra.core.models.conditions.types.WeekendConditiondatestring
Default
{{ trigger.date }}includeDetails booleanstring
Default
falseinterval Non-dynamicstring
Default
PT5MFormat
durationon string
Default
CREATE_OR_UPDATEPossible Values
CREATEUPDATECREATE_OR_UPDATErange string
scopes array
SubTypestring
Default
["https://www.googleapis.com/auth/spreadsheets.readonly","https://www.googleapis.com/auth/drive.metadata.readonly"]serviceAccount string
sheetName string
stateKey string
stateTtl string
stopAfter Non-dynamicarray
SubTypestring
Possible Values
CREATEDSUBMITTEDRUNNINGPAUSEDRESTARTEDKILLINGSUCCESSWARNINGFAILEDKILLEDCANCELLEDQUEUEDRETRYINGRETRIEDSKIPPEDBREAKPOINTRESUBMITTEDOutputs
count integer
modifications array
Definitions
io.kestra.plugin.googleworkspace.sheets.SheetModifiedTrigger-ModificationOutput
changeDetails
io.kestra.plugin.googleworkspace.sheets.SheetModifiedTrigger-ChangeDetails
affectedRangestring
columnCountinteger
hasDataboolean
rowCountinteger
lastModifyingUserstring
modifiedTimestring
Format
date-timerevisionIdstring
sheetNamestring
spreadsheetIdstring
spreadsheetTitlestring