Updated progress messages for gam <UserTypeEntity> print filelist|filecounts|filesharecounts|filetree select shareddriveid <SharedDriveID>
Some checks are pending
Build and test GAM / build (Win64, build, 10, VC-WIN64A, windows-2022) (push) Waiting to run
Build and test GAM / build (aarch64, build, 3, linux-aarch64, ubuntu-24.04-arm) (push) Waiting to run
Build and test GAM / build (aarch64, build, 4, linux-aarch64, ubuntu-22.04-arm) (push) Waiting to run
Build and test GAM / build (aarch64, build, 6, linux-aarch64, ubuntu-22.04-arm, yes) (push) Waiting to run
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-14) (push) Waiting to run
Build and test GAM / build (aarch64, build, 9, darwin64-arm64, macos-15) (push) Waiting to run
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 5, linux-x86_64, ubuntu-22.04, yes) (push) Waiting to run
Build and test GAM / build (x86_64, build, 7, darwin64-x86_64, macos-13) (push) Waiting to run
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Waiting to run
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Waiting to run
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Waiting to run
Build and test GAM / merge (push) Blocked by required conditions
Build and test GAM / publish (push) Blocked by required conditions
CodeQL / Analyze (python) (push) Waiting to run
Check for Google Root CA Updates / check-apis (push) Waiting to run

This commit is contained in:
Ross Scroggs 2025-04-07 17:21:02 -07:00
parent 0a3e00df80
commit f1d2223517
No known key found for this signature in database
GPG Key ID: 54585EA0887857D5
4 changed files with 263 additions and 247 deletions

View File

@ -353,6 +353,9 @@ If an item contains spaces, it should be surrounded by ".
now|today now|today
<RegularExpression> ::= <String> <RegularExpression> ::= <String>
See: https://docs.python.org/3/library/re.html See: https://docs.python.org/3/library/re.html
<REMatchPattern> ::= <RegularExpression>
<RESearchPattern> ::= <RegularExpression>
<RESubstitution> ::= <String>>
<ProjectID> ::= <String> <ProjectID> ::= <String>
Must match this Python Regular Expression: [a-z][a-z0-9-]{4,28}[a-z0-9] Must match this Python Regular Expression: [a-z][a-z0-9-]{4,28}[a-z0-9]
<ServiceAccountName> ::= <String> <ServiceAccountName> ::= <String>
@ -817,7 +820,7 @@ Specify a collection of ChromeOS devices by directly specifying them or by speci
(gcsdoc(:<FieldName>)+ <StorageBucketObjectName>)) (gcsdoc(:<FieldName>)+ <StorageBucketObjectName>))
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[endcsv|(fields <FieldNameList>)] [endcsv|(fields <FieldNameList>)]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <RESearchPattern>)*
[delimiter <Character>])| [delimiter <Character>])|
(croscsvfile_sn (croscsvfile_sn
((<FileName>(:<FieldName>)+ [charset <Charset>] )| ((<FileName>(:<FieldName>)+ [charset <Charset>] )|
@ -827,7 +830,7 @@ Specify a collection of ChromeOS devices by directly specifying them or by speci
(gcsdoc(:<FieldName>)+ <StorageBucketObjectName>)) (gcsdoc(:<FieldName>)+ <StorageBucketObjectName>))
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[endcsv|(fields <FieldNameList>)] [endcsv|(fields <FieldNameList>)]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <RESearchPattern>)*
[delimiter <Character>])| [delimiter <Character>])|
(datafile (datafile
cros|cros_sn|cros_ous|cros_ous_and_children cros|cros_sn|cros_ous|cros_ous_and_children
@ -844,7 +847,7 @@ Specify a collection of ChromeOS devices by directly specifying them or by speci
(gcsdoc(:<FieldName>)+ <StorageBucketObjectName>)) (gcsdoc(:<FieldName>)+ <StorageBucketObjectName>))
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[endcsv|(fields <FieldNameList>)] [endcsv|(fields <FieldNameList>)]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <REMatchPattern>)*
[delimiter <Character>])| [delimiter <Character>])|
(csvkmd (csvkmd
cros|cros_sn|cros_ous|cros_ous_and_children cros|cros_sn|cros_ous|cros_ous_and_children
@ -854,9 +857,9 @@ Specify a collection of ChromeOS devices by directly specifying them or by speci
(gcscsv <StorageBucketObjectName>)| (gcscsv <StorageBucketObjectName>)|
(gcsdoc <StorageBucketObjectName>)) (gcsdoc <StorageBucketObjectName>))
[charset <Charset>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]) [charset <Charset>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>])
keyfield <FieldName> [keypattern <RegularExpression>] [keyvalue <String>] [delimiter <Character>] keyfield <FieldName> [keypattern <REMatchPattern>] [keyvalue <String>] [delimiter <Character>]
subkeyfield <FieldName> [keypattern <RegularExpression>] [keyvalue <String>] [delimiter <Character>] subkeyfield <FieldName> [keypattern <REMatchPattern>] [keyvalue <String>] [delimiter <Character>]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <REMatchPattern>)*
[datafield <FieldName>(:<FieldName>)* [delimiter <Character>]]) [datafield <FieldName>(:<FieldName>)* [delimiter <Character>]])
(croscsvdata <FieldName>(:<FieldName>*)) (croscsvdata <FieldName>(:<FieldName>*))
@ -903,7 +906,7 @@ Specify a collection of Users by directly specifying them or by specifiying item
(gcsdoc(:<FieldName>)+ <StorageBucketObjectName>)) (gcsdoc(:<FieldName>)+ <StorageBucketObjectName>))
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[endcsv|(fields <FieldNameList>)] [endcsv|(fields <FieldNameList>)]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <REMatchPattern>)*
[delimiter <Character>])| [delimiter <Character>])|
(datafile (datafile
users|groups|groups_ns|groups_susp|groups_inde|ous|ous_ns|ous_susp| users|groups|groups_ns|groups_susp|groups_inde|ous|ous_ns|ous_susp|
@ -924,7 +927,7 @@ Specify a collection of Users by directly specifying them or by specifiying item
(gcsdoc(:<FieldName>)+ <StorageBucketObjectName>)) (gcsdoc(:<FieldName>)+ <StorageBucketObjectName>))
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[endcsv|(fields <FieldNameList>)] [endcsv|(fields <FieldNameList>)]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <REMatchPattern>)*
[delimiter <Character>])| [delimiter <Character>])|
(csvkmd (csvkmd
users|groups|groups_ns|groups_susp|groups_inde|ous|ous_ns|ous_susp| users|groups|groups_ns|groups_susp|groups_inde|ous|ous_ns|ous_susp|
@ -936,9 +939,9 @@ Specify a collection of Users by directly specifying them or by specifiying item
(gcscsv <StorageBucketObjectName>)| (gcscsv <StorageBucketObjectName>)|
(gcsdoc <StorageBucketObjectName>)) (gcsdoc <StorageBucketObjectName>))
[charset <Charset>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]) [charset <Charset>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>])
keyfield <FieldName> [keypattern <RegularExpression>] [keyvalue <String>] [delimiter <Character>] keyfield <FieldName> [keypattern <REMatchPattern>] [keyvalue <String>] [delimiter <Character>]
subkeyfield <FieldName> [keypattern <RegularExpression>] [keyvalue <String>] [delimiter <Character>] subkeyfield <FieldName> [keypattern <REMatchPattern>] [keyvalue <String>] [delimiter <Character>]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <REMatchPattern>)*
[datafield <FieldName>(:<FieldName>)* [delimiter <Character>]]) [datafield <FieldName>(:<FieldName>)* [delimiter <Character>]])
(csvdata <FieldName>(:<FieldName>*)) (csvdata <FieldName>(:<FieldName>*))
@ -970,7 +973,7 @@ Specify a collection of items by directly specifying them; the item type is dete
(gcsdoc(:<FieldName>)+ <StorageBucketObjectName>)) (gcsdoc(:<FieldName>)+ <StorageBucketObjectName>))
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[endcsv|(fields <FieldNameList>)] [endcsv|(fields <FieldNameList>)]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <REMatchPattern>)*
[delimiter <Character>] [delimiter <Character>]
<CSVkmdSelector> ::= <CSVkmdSelector> ::=
@ -984,9 +987,9 @@ Specify a collection of items by directly specifying them; the item type is dete
(gcscsv <StorageBucketObjectName>)| (gcscsv <StorageBucketObjectName>)|
(gcsdoc <StorageBucketObjectName>)) (gcsdoc <StorageBucketObjectName>))
[charset <Charset>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]) [charset <Charset>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>])
keyfield <FieldName> [keypattern <RegularExpression>] [keyvalue <String>] [delimiter <Character>] keyfield <FieldName> [keypattern <REMatchPattern>] [keyvalue <String>] [delimiter <Character>]
subkeyfield <FieldName> [keypattern <RegularExpression>] [keyvalue <String>] [delimiter <Character>] subkeyfield <FieldName> [keypattern <REMatchPattern>] [keyvalue <String>] [delimiter <Character>]
(matchfield|skipfield <FieldName> <RegularExpression>)* (matchfield|skipfield <FieldName> <REMatchPattern>)*
[datafield <FieldName>(:<FieldName>)* [delimiter <Character>]] [datafield <FieldName>(:<FieldName>)* [delimiter <Character>]]
<CSVSubkeySelector> ::= csvsubkey <FieldName> <CSVSubkeySelector> ::= csvsubkey <FieldName>
<CSVDataSelector> ::= csvdata <FieldName>(:<FieldName>)* <CSVDataSelector> ::= csvdata <FieldName>(:<FieldName>)*
@ -1324,13 +1327,13 @@ gam tbatch <BatchContent> [showcmds [<Boolean>]]
gam csv <CSVLoopContent> [warnifnodata] gam csv <CSVLoopContent> [warnifnodata]
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]
(matchfield|skipfield <FieldName> <RegularExpression>)* [showcmds [<Boolean>]] (matchfield|skipfield <FieldName> <REMatchPattern>)* [showcmds [<Boolean>]]
[skiprows <Integer>] [maxrows <Integer>] [skiprows <Integer>] [maxrows <Integer>]
gam <GAMArgumentList> gam <GAMArgumentList>
gam loop <CSVLoopContent> [warnifnodata] gam loop <CSVLoopContent> [warnifnodata]
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]
(matchfield|skipfield <FieldName> <RegularExpression>)* [showcmds [<Boolean>]] (matchfield|skipfield <FieldName> <REMatchPattern>)* [showcmds [<Boolean>]]
[skiprows <Integer>] [maxrows <Integer>] [skiprows <Integer>] [maxrows <Integer>]
gam <GAMArgumentList> gam <GAMArgumentList>
@ -1511,7 +1514,7 @@ gam print alias|aliases [todrive <ToDriveAttribute>*]
[limittoou <OrgUnitItem>]) [limittoou <OrgUnitItem>])
[user|users <EmailAddressList>] [group|groups <EmailAddressList>] [user|users <EmailAddressList>] [group|groups <EmailAddressList>]
[select <UserTypeEntity>] [select <UserTypeEntity>]
[aliasmatchpattern <RegularExpression>] [aliasmatchpattern <REMatchPattern>]
[shownoneditable] [nogroups] [nousers] [shownoneditable] [nogroups] [nousers]
[onerowpertarget] [delimiter <Character>] [onerowpertarget] [delimiter <Character>]
[suppressnoaliasrows] [suppressnoaliasrows]
@ -1627,20 +1630,20 @@ gam calendar <CalendarEntity> printacl [todrive <ToDriveAttribute>*]
(matchfield attendeesonlydomainlist <DomainNameList>)| (matchfield attendeesonlydomainlist <DomainNameList>)|
(matchfield attendeesdomainlist <DomainNameList>)| (matchfield attendeesdomainlist <DomainNameList>)|
(matchfield attendeesnotdomainlist <DomainNameList>)| (matchfield attendeesnotdomainlist <DomainNameList>)|
(matchfield attendeespattern <RegularExpression>)| (matchfield attendeespattern <RESearchPattern>)|
(matchfield attendeesstatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddressEntity>)| (matchfield attendeesstatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddressEntity>)|
(matchfield creatoremail <RegularExpression>)| (matchfield creatoremail <RESearchPattern>)|
(matchfield creatorname <RegularExpression>)| (matchfield creatorname <RESearchPattern>)|
(matchfield description <RegularExpression>)| (matchfield description <RESearchPattern>)|
(matchfield hangoutlink <RegularExpression>)| (matchfield hangoutlink <RESearchPattern>)|
(matchfield location <RegularExpression>)| (matchfield location <RESearchPattern>)|
(matchfield organizeremail <RegularExpression>)| (matchfield organizeremail <RESearchPattern>)|
(matchfield organizername <RegularExpression>)| (matchfield organizername <RESearchPattern>)|
(matchfield organizerself <Boolean>)| (matchfield organizerself <Boolean>)|
(matchfield status <RegularExpression>)| (matchfield status <RESearchPattern>)|
(matchfield summary <RegularExpression>)| (matchfield summary <RESearchPattern>)|
(matchfield transparency <RegularExpression>)| (matchfield transparency <RESearchPattern>)|
(matchfield visibility <RegularExpression>) (matchfield visibility <RESearchPattern>)
<EventIDEntity> ::= <EventIDEntity> ::=
(id|eventid <EventId>) | (id|eventid <EventId>) |
@ -1718,7 +1721,7 @@ The following attributes are equivalent:
(clearsharedproperty <PropertyKey>)| (clearsharedproperty <PropertyKey>)|
(removeattendee <EmailAddress>)| (removeattendee <EmailAddress>)|
(removeresource <ResourceID>)| (removeresource <ResourceID>)|
(replacedescription <RegularExpression> <String>)| (replacedescription <REMatchPattern> <RESubstitution>)|
(selectremoveattendees <UserTypeEntity>) (selectremoveattendees <UserTypeEntity>)
<EventNotificationAttribute> ::= <EventNotificationAttribute> ::=
@ -3147,7 +3150,7 @@ gam info courses <CourseEntity> [owneraccess]
[formatjson] [formatjson]
gam print courses [todrive <ToDriveAttribute>*] gam print courses [todrive <ToDriveAttribute>*]
(course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>]) (course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
[owneremail] [owneremailmatchpattern <RegularExpression>] [owneremail] [owneremailmatchpattern <REMatchPattern>]
[alias|aliases|aliasesincolumns [delimiter <Character>]] [alias|aliases|aliasesincolumns [delimiter <Character>]]
[show all|students|teachers] [countsonly] [show all|students|teachers] [countsonly]
[timefilter creationtime|updatetime] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>] [timefilter creationtime|updatetime] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
@ -3474,14 +3477,14 @@ gam show domainaliases|aliasdomains
<ContactSelection> ::= <ContactSelection> ::=
[query <QueryContact>] [query <QueryContact>]
[emailmatchpattern <RegularExpression> [emailmatchtype work|home|other|<String>]] [emailmatchpattern <REMatchPattern> [emailmatchtype work|home|other|<String>]]
[updated_min <Date>] [updated_min <Date>]
gam create contact <ContactAttribute>+ gam create contact <ContactAttribute>+
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*))| returnidonly] [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*))| returnidonly]
gam update contacts <ContactEntity>|<ContactSelection> <ContactAttribute>+ gam update contacts <ContactEntity>|<ContactSelection> <ContactAttribute>+
gam clear contacts <ContactEntity>|<ContactSelection> gam clear contacts <ContactEntity>|<ContactSelection>
[emailclearpattern <RegularExpression>] [emailcleartype work|home|other|<String>] [emailclearpattern <REMatchPattern>] [emailcleartype work|home|other|<String>]
[delete_cleared_contacts_with_no_emails] [delete_cleared_contacts_with_no_emails]
gam dedup contacts <ContactEntity>|<ContactSelection> [matchType [<Boolean>]] gam dedup contacts <ContactEntity>|<ContactSelection> [matchType [<Boolean>]]
gam delete contacts <ContactEntity>|<ContactSelection> gam delete contacts <ContactEntity>|<ContactSelection>
@ -3758,7 +3761,7 @@ gam update group|groups <GroupEntity> update [<GroupRole>]
gam update group|groups <GroupEntity> clear [member] [manager] [owner] gam update group|groups <GroupEntity> clear [member] [manager] [owner]
[usersonly|groupsonly] [usersonly|groupsonly]
[notsuspended|suspended] [notarchived|archived] [notsuspended|suspended] [notarchived|archived]
[emailclearpattern|emailretainpattern <RegularExpression>] [emailclearpattern|emailretainpattern <REMatchPattern>]
[removedomainnostatusmembers] [removedomainnostatusmembers]
[preview] [actioncsv] [preview] [actioncsv]
gam delete group|groups <GroupEntity> [noactionifalias] gam delete group|groups <GroupEntity> [noactionifalias]
@ -3847,14 +3850,14 @@ gam info group|groups <GroupEntity>
[internal] [internaldomains <DomainNameList>] [external] [internal] [internaldomains <DomainNameList>] [external]
[notsuspended|suspended] [notarchived|archived] [notsuspended|suspended] [notarchived|archived]
[types <GroupMemberTypeList>] [types <GroupMemberTypeList>]
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>] [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
[formatjson] [formatjson]
gam print groups [todrive <ToDriveAttribute>*] gam print groups [todrive <ToDriveAttribute>*]
[([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))| [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))|
(group|group_ns|group_susp <GroupItem>)| (group|group_ns|group_susp <GroupItem>)|
(select <GroupEntity>)] (select <GroupEntity>)]
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
[descriptionmatchpattern [not] <RegularExpression>] (matchsetting [not] <GroupAttribute>)* [descriptionmatchpattern [not] <REMatchPattern>] (matchsetting [not] <GroupAttribute>)*
[admincreatedmatch <Boolean>] [admincreatedmatch <Boolean>]
[maxresults <Number>] [maxresults <Number>]
[allfields|([basic] [settings] <GroupFieldName>* [fields <GroupFieldNameList>])] [allfields|([basic] [settings] <GroupFieldName>* [fields <GroupFieldNameList>])]
@ -3866,7 +3869,7 @@ gam print groups [todrive <ToDriveAttribute>*]
[includederivedmembership] [includederivedmembership]
[notsuspended|suspended] [notarchived|archived] [notsuspended|suspended] [notarchived|archived]
[types <GroupMemberTypeList>] [types <GroupMemberTypeList>]
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>] [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
[convertcrnl] [delimiter <Character>] [sortheaders] [convertcrnl] [delimiter <Character>] [sortheaders]
[formatjson [quotechar <Character>]] [formatjson [quotechar <Character>]]
[showitemcountonly] [showitemcountonly]
@ -3894,8 +3897,8 @@ gam print group-members [todrive <ToDriveAttribute>*]
[([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))| [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))|
(group|group_ns|group_susp <GroupItem>)| (group|group_ns|group_susp <GroupItem>)|
(select <GroupEntity>)] (select <GroupEntity>)]
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
[descriptionmatchpattern [not] <RegularExpression>] [descriptionmatchpattern [not] <REMatchPattern>]
[admincreatedmatch <Boolean>] [admincreatedmatch <Boolean>]
[roles <GroupRoleList>] [members] [managers] [owners] [roles <GroupRoleList>] [members] [managers] [owners]
[internal] [internaldomains <DomainNameList>] [external] [internal] [internaldomains <DomainNameList>] [external]
@ -3903,7 +3906,7 @@ gam print group-members [todrive <ToDriveAttribute>*]
<MembersFieldName>* [fields <MembersFieldNameList>] <MembersFieldName>* [fields <MembersFieldNameList>]
[notsuspended|suspended] [notarchived|archived] [notsuspended|suspended] [notarchived|archived]
[types <GroupMemberTypeList>] [types <GroupMemberTypeList>]
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>] [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
[userfields <UserFieldNameList>] [userfields <UserFieldNameList>]
[allschemas|(schemas|custom|customschemas <SchemaNameList>)] [allschemas|(schemas|custom|customschemas <SchemaNameList>)]
[(recursive [noduplicates])|includederivedmembership] [nogroupemail] [(recursive [noduplicates])|includederivedmembership] [nogroupemail]
@ -3914,14 +3917,14 @@ gam print group-members [todrive <ToDriveAttribute>*]
[([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))| [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))|
(group|group_ns|group_susp <GroupItem>)| (group|group_ns|group_susp <GroupItem>)|
(select <GroupEntity>)] (select <GroupEntity>)]
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
[descriptionmatchpattern [not] <RegularExpression>] [descriptionmatchpattern [not] <REMatchPattern>]
[admincreatedmatch <Boolean>] [admincreatedmatch <Boolean>]
[roles <GroupRoleList>] [members] [managers] [owners] [depth <Number>] [roles <GroupRoleList>] [members] [managers] [owners] [depth <Number>]
[internal] [internaldomains <DomainNameList>] [external] [internal] [internaldomains <DomainNameList>] [external]
[notsuspended|suspended] [notarchived|archived] [notsuspended|suspended] [notarchived|archived]
[types <GroupMemberTypeList>] [types <GroupMemberTypeList>]
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>] [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
[includederivedmembership] [includederivedmembership]
# Cloud Identity Groups # Cloud Identity Groups
@ -3977,7 +3980,7 @@ gam update cigroups <GroupEntity> update [<GroupRole>]
<UserTypeEntity> <UserTypeEntity>
gam update cigroups <GroupEntity> clear [member] [manager] [owner] gam update cigroups <GroupEntity> clear [member] [manager] [owner]
[usersonly|groupsonly] [usersonly|groupsonly]
[emailclearpattern|emailretainpattern <RegularExpression>] [emailclearpattern|emailretainpattern <REMatchPattern>]
[preview] [actioncsv] [preview] [actioncsv]
gam delete cigroups <GroupEntity> gam delete cigroups <GroupEntity>
@ -3988,19 +3991,19 @@ gam info cigroups <GroupEntity>
[roles <GroupRoleList>] [members] [managers] [owners] [roles <GroupRoleList>] [members] [managers] [owners]
[internal] [internaldomains <DomainNameList>] [external] [internal] [internaldomains <DomainNameList>] [external]
[types <CIGroupMemberTypeList>] [types <CIGroupMemberTypeList>]
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>] [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
[formatjson] [formatjson]
gam print cigroups [todrive <ToDriveAttribute>*] gam print cigroups [todrive <ToDriveAttribute>*]
[(cimember|ciowner <UserItem>)|(select <GroupEntity>)|(query <String>)] [(cimember|ciowner <UserItem>)|(select <GroupEntity>)|(query <String>)]
[showownedby <UserItem>] [showownedby <UserItem>]
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
[descriptionmatchpattern [not] <RegularExpression>] [descriptionmatchpattern [not] <REMatchPattern>]
[basic|allfields|(<CIGroupFieldName>* [fields <CIGroupFieldNameList>])] [basic|allfields|(<CIGroupFieldName>* [fields <CIGroupFieldNameList>])]
[roles <GroupRoleList>] [memberrestrictions] [roles <GroupRoleList>] [memberrestrictions]
[members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly] [members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly]
[internal] [internaldomains <DomainNameList>] [external] [internal] [internaldomains <DomainNameList>] [external]
[types <CIGroupMemberTypeList>] [types <CIGroupMemberTypeList>]
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>] [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
[convertcrnl] [delimiter <Character>] [convertcrnl] [delimiter <Character>]
[formatjson [quotechar <Character>]] [formatjson [quotechar <Character>]]
[showitemcountonly] [showitemcountonly]
@ -4022,11 +4025,11 @@ gam info cimember <UserTypeEntity> <GroupEntity>
gam print cigroup-members [todrive <ToDriveAttribute>*] gam print cigroup-members [todrive <ToDriveAttribute>*]
[(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)] [(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
[showownedby <UserItem>] [showownedby <UserItem>]
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
[descriptionmatchpattern [not] <RegularExpression>] [descriptionmatchpattern [not] <REMatchPattern>]
[roles <GroupRoleList>] [members] [managers] [owners] [roles <GroupRoleList>] [members] [managers] [owners]
[types <CIGroupMemberTypeList>] [types <CIGroupMemberTypeList>]
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>] [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
<CIGroupMembersFieldName>* [fields <CIGroupMembersFieldNameList>] <CIGroupMembersFieldName>* [fields <CIGroupMembersFieldNameList>]
[minimal|basic|full] [minimal|basic|full]
[(recursive [noduplicates]) | includederivedmembership] [nogroupemail] [(recursive [noduplicates]) | includederivedmembership] [nogroupemail]
@ -4034,11 +4037,11 @@ gam print cigroup-members [todrive <ToDriveAttribute>*]
gam show cigroup-members gam show cigroup-members
[(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)] [(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
[showownedby <UserItem>] [showownedby <UserItem>]
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
[descriptionmatchpattern [not] <RegularExpression>] [descriptionmatchpattern [not] <REMatchPattern>]
[roles <GroupRoleList>] [members] [managers] [owners] [roles <GroupRoleList>] [members] [managers] [owners]
[types <CIGroupMemberTypeList>] [types <CIGroupMemberTypeList>]
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>] [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
[minimal|basic|full] [minimal|basic|full]
[(depth <Number>) | includederivedmembership] [(depth <Number>) | includederivedmembership]
@ -4173,11 +4176,11 @@ gam info policies <CIPolicyNameEntity>
[formatjson] [formatjson]
gam print policies [todrive <ToDriveAttribute>*] gam print policies [todrive <ToDriveAttribute>*]
[filter <String>] [nowarnings] [noappnames] [filter <String>] [nowarnings] [noappnames]
[group <RegularExpression>] [ou|org|orgunit <RegularExpression>] [group <REMatchPattern>] [ou|org|orgunit <REMatchPattern>]
[formatjson [quotechar <Character>]] [formatjson [quotechar <Character>]]
gam show policies gam show policies
[filter <String>] [nowarnings] [noappnames] [filter <String>] [nowarnings] [noappnames]
[group <RegularExpression>] [ou|org|orgunit <RegularExpression>] [group <REMatchPattern>] [ou|org|orgunit <REMatchPattern>]
[formatjson] [formatjson]
# Inbound SSO # Inbound SSO
@ -4737,7 +4740,7 @@ gam sendemail [recipient|to] <RecipientEntity>
[subject <String>] [subject <String>]
[<MessageContent>] [<MessageContent>]
(replace <Tag> <String>)* (replace <Tag> <String>)*
(replaceregex <RegularExpression> <String> <Tag> <String>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <String>)*
[html [<Boolean>]] (attach <FileName> [charset <Charset>])* [html [<Boolean>]] (attach <FileName> [charset <Charset>])*
(embedimage <FileName> <String>)* (embedimage <FileName> <String>)*
[newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>] [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@ -4748,7 +4751,7 @@ gam <UserTypeEntity> sendemail recipient|to <RecipientEntity>
[subject <String>] [subject <String>]
[<MessageContent>] [<MessageContent>]
(replace <Tag> <String>)* (replace <Tag> <String>)*
(replaceregex <RegularExpression> <String> <Tag> <String>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <String>)*
[html [<Boolean>]] (attach <FileName> [charset <Charset>])* [html [<Boolean>]] (attach <FileName> [charset <Charset>])*
(embedimage <FileName> <String>)* (embedimage <FileName> <String>)*
[newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>] [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@ -4759,7 +4762,7 @@ gam <UserTypeEntity> sendemail from <EmailAddress>
[subject <String>] [subject <String>]
[<MessageContent>] [<MessageContent>]
(replace <Tag> <String>)* (replace <Tag> <String>)*
(replaceregex <RegularExpression> <String> <Tag> <String>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <String>)*
[html [<Boolean>]] (attach <FileName> [charset <Charset>])* [html [<Boolean>]] (attach <FileName> [charset <Charset>])*
(embedimage <FileName> <String>)* (embedimage <FileName> <String>)*
[newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>] [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@ -4821,12 +4824,12 @@ gam show shareddriveinfo <SharedDriveEntity>
[formatjson] [formatjson]
gam print shareddrives [todrive <ToDriveAttribute>*] gam print shareddrives [todrive <ToDriveAttribute>*]
[teamdriveadminquery|query <QueryTeamDrive>] [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]] [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
[formatjson [quotechar <Character>]] [formatjson [quotechar <Character>]]
gam show shareddrives gam show shareddrives
[teamdriveadminquery|query <QueryTeamDrive>] [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]] [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
[formatjson] [noorgunits [<Boolean>]] [formatjson] [noorgunits [<Boolean>]]
@ -4860,13 +4863,13 @@ gam <UserTypeEntity> show shareddriveinfo <SharedDriveEntity>
[formatjson] [formatjson]
gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*] gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*]
adminaccess [teamdriveadminquery|query <QueryTeamDrive>] adminaccess [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
(role|roles <SharedDriveACLRoleList>)* (role|roles <SharedDriveACLRoleList>)*
[fields <SharedDriveFieldNameList>] [fields <SharedDriveFieldNameList>]
[formatjson [quotechar <Character>]] [formatjson [quotechar <Character>]]
gam <UserTypeEntity> show shareddrives gam <UserTypeEntity> show shareddrives
adminaccess [teamdriveadminquery|query <QueryTeamDrive>] adminaccess [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
(role|roles <SharedDriveACLRoleList>)* (role|roles <SharedDriveACLRoleList>)*
[fields <SharedDriveFieldNameList>] [fields <SharedDriveFieldNameList>]
[formatjson] [formatjson]
@ -4894,13 +4897,13 @@ gam <UserTypeEntity> show shareddriveinfo <SharedDriveEntity>
[guiroles [<Boolean>]] [formatjson] [guiroles [<Boolean>]] [formatjson]
gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*] gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*]
[teamdriveadminquery|query <QueryTeamDrive>] [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
(role|roles <SharedDriveACLRoleList>)* (role|roles <SharedDriveACLRoleList>)*
[fields <SharedDriveFieldNameList>] [fields <SharedDriveFieldNameList>]
[guiroles [<Boolean>]] [formatjson [quotechar <Character>]] [guiroles [<Boolean>]] [formatjson [quotechar <Character>]]
gam <UserTypeEntity> show shareddrives gam <UserTypeEntity> show shareddrives
[teamdriveadminquery|query <QueryTeamDrive>] [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
(role|roles <SharedDriveACLRoleList>)* (role|roles <SharedDriveACLRoleList>)*
[fields <SharedDriveFieldNameList>] [fields <SharedDriveFieldNameList>]
[guiroles [<Boolean>]] [formatjson] [guiroles [<Boolean>]] [formatjson]
@ -5043,7 +5046,7 @@ gam sync teamdriveacls <SharedDriveEntity> with <SharedDriveEntity>
gam print teamdriveacls [todrive <ToDriveAttribute>*] gam print teamdriveacls [todrive <ToDriveAttribute>*]
[teamdriveadminquery|query <QueryTeamDrive>] [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
[user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)* [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
<PermissionMatch>* [<PermissionMatchAction>] [pmselect] <PermissionMatch>* [<PermissionMatchAction>] [pmselect]
[oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)] [oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)]
@ -5051,7 +5054,7 @@ gam print teamdriveacls [todrive <ToDriveAttribute>*]
[formatjson [quotechar <Character>]] [formatjson [quotechar <Character>]]
gam show teamdriveacls gam show teamdriveacls
[teamdriveadminquery|query <QueryTeamDrive>] [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
[user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)* [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
<PermissionMatch>* [<PermissionMatchAction>] [pmselect] <PermissionMatch>* [<PermissionMatchAction>] [pmselect]
[oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)] [oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)]
@ -5072,7 +5075,7 @@ gam <UserTypeEntity> sync teamdriveacls <SharedDriveEntity> with <SharedDriveEnt
gam <UserTypeEntity> print teamdriveacls [todrive <ToDriveAttribute>*] gam <UserTypeEntity> print teamdriveacls [todrive <ToDriveAttribute>*]
[adminaccess|asadmin] [teamdriveadminquery|query <QueryTeamDrive>] [adminaccess|asadmin] [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
[user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)* [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
<PermissionMatch>* [<PermissionMatchAction>] [pmselect] <PermissionMatch>* [<PermissionMatchAction>] [pmselect]
[oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)] [oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)]
@ -5081,7 +5084,7 @@ gam <UserTypeEntity> print teamdriveacls [todrive <ToDriveAttribute>*]
[formatjson [quotechar <Character>]] [formatjson [quotechar <Character>]]
gam <UserTypeEntity> show teamdriveacls gam <UserTypeEntity> show teamdriveacls
[adminaccess|asadmin] [teamdriveadminquery|query <QueryTeamDrive>] [adminaccess|asadmin] [teamdriveadminquery|query <QueryTeamDrive>]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
[user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)* [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
<PermissionMatch>* [<PermissionMatchAction>] [pmselect] <PermissionMatch>* [<PermissionMatchAction>] [pmselect]
[oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)] [oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)]
@ -5281,19 +5284,19 @@ gam delete vaultexport|export <ExportItem> matter <MatterItem>
gam delete vaultexport|export <MatterItem> <ExportItem> gam delete vaultexport|export <MatterItem> <ExportItem>
gam download vaultexport|export <ExportItem> matter <MatterItem> gam download vaultexport|export <ExportItem> matter <MatterItem>
[targetfolder <FilePath>] [targetname <FileName>] [noverify] [noextract] [ziptostdout] [targetfolder <FilePath>] [targetname <FileName>] [noverify] [noextract] [ziptostdout]
[bucketmatchpattern <RegularExpression>] [objectmatchpattern <RegularExpression>] [bucketmatchpattern <REMatchPattern>] [objectmatchpattern <REMatchPattern>]
[downloadattempts <Integer>] [retryinterval <Integer>] [downloadattempts <Integer>] [retryinterval <Integer>]
gam download vaultexport|export <MatterItem> <ExportItem> gam download vaultexport|export <MatterItem> <ExportItem>
[targetfolder <FilePath>] [targetname <FileName>] [noverify] [noextract] [ziptostdout] [targetfolder <FilePath>] [targetname <FileName>] [noverify] [noextract] [ziptostdout]
[bucketmatchpattern <RegularExpression>] [objectmatchpattern <RegularExpression>] [bucketmatchpattern <REMatchPattern>] [objectmatchpattern <REMatchPattern>]
[downloadattempts <Integer>] [retryinterval <Integer>] [downloadattempts <Integer>] [retryinterval <Integer>]
gam copy vaultexport|export <ExportItem> matter <MatterItem> gam copy vaultexport|export <ExportItem> matter <MatterItem>
[targetbucket <String>] [targetprefix <String>] [targetbucket <String>] [targetprefix <String>]
[bucketmatchpattern <RegularExpression>] [objectmatchpattern <RegularExpression>] [bucketmatchpattern <REMatchPattern>] [objectmatchpattern <REMatchPattern>]
[copyattempts <Integer>] [retryinterval <Integer>] [copyattempts <Integer>] [retryinterval <Integer>]
gam copy vaultexport|export <MatterItem> <ExportItem> gam copy vaultexport|export <MatterItem> <ExportItem>
[targetbucket <String>] [targetprefix <String>] [targetbucket <String>] [targetprefix <String>]
[bucketmatchpattern <RegularExpression>] [objectmatchpattern <RegularExpression>] [bucketmatchpattern <REMatchPattern>] [objectmatchpattern <REMatchPattern>]
[copyattempts <Integer>] [retryinterval <Integer>] [copyattempts <Integer>] [retryinterval <Integer>]
<VaultExportFieldName> ::= <VaultExportFieldName> ::=
@ -5567,7 +5570,7 @@ gam create|add user <EmailAddress> [ignorenullpassword] <UserAttribute>*
[replyto <EmailAaddress>] [replyto <EmailAaddress>]
[<NotifyMessageContent>] [<NotifyMessageContent>]
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
] ]
[logpassword <FileName>] [logpassword <FileName>]
[addnumericsuffixonduplicate <Number>] [addnumericsuffixonduplicate <Number>]
@ -5576,7 +5579,7 @@ gam <UserTypeEntity> waitformailbox [retries <Number>]
gam update user <UserItem> [ignorenullpassword] <UserAttribute>* gam update user <UserItem> [ignorenullpassword] <UserAttribute>*
[verifynotinvitable|alwaysevict] [noactionifalias] [verifynotinvitable|alwaysevict] [noactionifalias]
[updateprimaryemail <RegularExpression> <EmailReplacement>] [updateprimaryemail <RESearchPattern> <RESubstitution>]
[updateoufromgroup <FileName> [charset <Charset>] [updateoufromgroup <FileName> [charset <Charset>]
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]] [fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]]
@ -5593,7 +5596,7 @@ gam update user <UserItem> [ignorenullpassword] <UserAttribute>*
[replyto <EmailAddress>] [replyto <EmailAddress>]
[<NotifyMessageContent>] [<NotifyMessageContent>]
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
] ]
[notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]] [notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]]
[logpassword <FileName>] [logpassword <FileName>]
@ -5614,7 +5617,7 @@ gam info user [<UserItem>]
gam update users <UserTypeEntity> [ignorenullpassword] <UserAttribute>* gam update users <UserTypeEntity> [ignorenullpassword] <UserAttribute>*
[verifynotinvitable|alwaysevict] [noactionifalias] [verifynotinvitable|alwaysevict] [noactionifalias]
[updateprimaryemail <RegularExpression> <EmailReplacement>] [updateprimaryemail <RESearchPattern> <RESubstitution>]
[updateoufromgroup <FileName> [charset <Charset>] [updateoufromgroup <FileName> [charset <Charset>]
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]] [fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]]
@ -5630,7 +5633,7 @@ gam update users <UserTypeEntity> [ignorenullpassword] <UserAttribute>*
[replyto <EmailAaddress>] [replyto <EmailAaddress>]
[<NotifyMessageContent>] [<NotifyMessageContent>]
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
] ]
[notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]] [notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]]
[logpassword <FileName>] [logpassword <FileName>]
@ -5651,7 +5654,7 @@ gam info users <UserTypeEntity>
gam <UserTypeEntity> update users [ignorenullpassword] <UserAttribute>* gam <UserTypeEntity> update users [ignorenullpassword] <UserAttribute>*
[verifynotinvitable|alwaysevict] [noactionifalias] [verifynotinvitable|alwaysevict] [noactionifalias]
[updateprimaryemail <RegularExpression> <EmailReplacement>] [updateprimaryemail <RESearchPattern> <RESubstitution>]
[updateoufromgroup <FileName> [charset <Charset>] [updateoufromgroup <FileName> [charset <Charset>]
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
[fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]] [fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]]
@ -5667,7 +5670,7 @@ gam <UserTypeEntity> update users [ignorenullpassword] <UserAttribute>*
[replyto <EmailAddress>] [replyto <EmailAddress>]
[<NotifyMessageContent>] [<NotifyMessageContent>]
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
] ]
[notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]] [notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]]
[logpassword <FileName>] [logpassword <FileName>]
@ -5704,7 +5707,7 @@ gam print users [todrive <ToDriveAttribute>*]
[userview] [basic|full|allfields|(<UserFieldName>*|fields <UserFieldNameList>)] [userview] [basic|full|allfields|(<UserFieldName>*|fields <UserFieldNameList>)]
[delimiter <Character>] [sortheaders [<Boolean>]] [scalarsfirst [<Boolean>]] [delimiter <Character>] [sortheaders [<Boolean>]] [scalarsfirst [<Boolean>]]
[formatjson [quotechar <Character>]] [quoteplusphonenumbers] [formatjson [quotechar <Character>]] [quoteplusphonenumbers]
[issuspended <Boolean>] [aliasmatchpattern <RegularExpression>] [issuspended <Boolean>] [aliasmatchpattern <REMatchPattern>]
[showvalidcolumn] (addcsvdata <FieldName> <String>)* [showvalidcolumn] (addcsvdata <FieldName> <String>)*
[showitemcountonly] [showitemcountonly]
@ -5721,7 +5724,7 @@ gam print users [todrive <ToDriveAttribute>*] select <UserTypeEntity>
[userview] [basic|full|allfields|(<UserFieldName>*|fields <UserFieldNameList>)] [userview] [basic|full|allfields|(<UserFieldName>*|fields <UserFieldNameList>)]
[delimiter <Character>] [sortheaders [<Boolean>]] [scalarsfirst [<Boolean>]] [delimiter <Character>] [sortheaders [<Boolean>]] [scalarsfirst [<Boolean>]]
[formatjson [quotechar <Character>]] [quoteplusphonenumbers] [formatjson [quotechar <Character>]] [quoteplusphonenumbers]
[issuspended <Boolean>] [aliasmatchpattern <RegularExpression>] [issuspended <Boolean>] [aliasmatchpattern <REMatchPattern>]
[showvalidcolumn] (addcsvdata <FieldName> <String>)* [showvalidcolumn] (addcsvdata <FieldName> <String>)*
[showitemcountonly] [showitemcountonly]
@ -5736,7 +5739,7 @@ gam <UserTypeEntity> print users [todrive <ToDriveAttribute>*]
[userview] [basic|full|allfields|(<UserFieldName>*|fields <UserFieldNameList>)] [userview] [basic|full|allfields|(<UserFieldName>*|fields <UserFieldNameList>)]
[delimiter <Character>] [sortheaders [<Boolean>]] [scalarsfirst [<Boolean>]] [delimiter <Character>] [sortheaders [<Boolean>]] [scalarsfirst [<Boolean>]]
[formatjson [quotechar <Character>]] [quoteplusphonenumbers] [formatjson [quotechar <Character>]] [quoteplusphonenumbers]
[issuspended <Boolean>] [aliasmatchpattern <RegularExpression>] [issuspended <Boolean>] [aliasmatchpattern <REMatchPattern>]
[showvalidcolumn] (addcsvdata <FieldName> <String>)* [showvalidcolumn] (addcsvdata <FieldName> <String>)*
[showitemcountonly] [showitemcountonly]
@ -5975,19 +5978,19 @@ gam <UserTypeEntity> transfer calendars|seccals <UserItem> [<UserCalendarEntity>
<EventMatchProperty> ::= <EventMatchProperty> ::=
(matchfield attendees <EmailAddressEntity>)| (matchfield attendees <EmailAddressEntity>)|
(matchfield attendeespattern <RegularExpression>)| (matchfield attendeespattern <RESearchPattern>)|
(matchfield attendeesstatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddressEntity>)| (matchfield attendeesstatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddressEntity>)|
(matchfield creatoremail <RegularExpression>)| (matchfield creatoremail <RESearchPattern>)|
(matchfield creatorname <RegularExpression>)| (matchfield creatorname <RESearchPattern>)|
(matchfield description <RegularExpression>)| (matchfield description <RESearchPattern>)|
(matchfield hangoutlink <RegularExpression>)| (matchfield hangoutlink <RESearchPattern>)|
(matchfield location <RegularExpression>)| (matchfield location <RESearchPattern>)|
(matchfield organizeremail <RegularExpression>)| (matchfield organizeremail <RESearchPattern>)|
(matchfield organizername <RegularExpression>)| (matchfield organizername <RESearchPattern>)|
(matchfield status <RegularExpression>)| (matchfield status <RESearchPattern>)|
(matchfield summary <RegularExpression>)| (matchfield summary <RESearchPattern>)|
(matchfield transparency <RegularExpression>)| (matchfield transparency <RESearchPattern>)|
(matchfield visibility <RegularExpression>) (matchfield visibility <RESearchPattern>)
<EventIDEntity> ::= <EventIDEntity> ::=
(id|eventid <EventId>) | (id|eventid <EventId>) |
@ -6064,7 +6067,7 @@ The following attributes are equivalent:
(clearprivateproperty <PropertyKey>)| (clearprivateproperty <PropertyKey>)|
(clearsharedproperty <PropertyKey>)| (clearsharedproperty <PropertyKey>)|
(removeattendee <EmailAddress>)| (removeattendee <EmailAddress>)|
(replacedescription <RegularExpression> <String>)| (replacedescription <REMatchPattern> <RESubstitution>)|
(selectremoveattendees <UserTypeEntity>) (selectremoveattendees <UserTypeEntity>)
<EventNotificationAttribute> ::= <EventNotificationAttribute> ::=
@ -6517,7 +6520,7 @@ gam <UserTypeEntity> print chatevents [todrive <ToDriveAttribute>*]
gam <UserTypeEntity> create|add drivefile gam <UserTypeEntity> create|add drivefile
[(localfile <FileName>|-)|(url <URL>)] [(localfile <FileName>|-)|(url <URL>)]
[(drivefilename|newfilename <DriveFileName>) | (replacefilename <RegularExpression> <String>)*] [(drivefilename|newfilename <DriveFileName>) | (replacefilename <REMatchPattern> <RESubstitution>)*]
[stripnameprefix <String>] [noduplicate] [stripnameprefix <String>] [noduplicate]
[timestamp [<Boolean>]] [timeformat <String>] [timestamp [<Boolean>]] [timeformat <String>]
<DriveFileCreateAttribute>* <DriveFileCreateAttribute>*
@ -6538,7 +6541,7 @@ gam <UserTypeEntity> create|add drivefile
gam <UserTypeEntity> update drivefile <DriveFileEntity> [copy] [returnidonly|returnlinkonly] gam <UserTypeEntity> update drivefile <DriveFileEntity> [copy] [returnidonly|returnlinkonly]
[(localfile <FileName>|-)|(url <URL>)] [(localfile <FileName>|-)|(url <URL>)]
[retainname | (newfilename <DriveFileName>) | (replacefilename <RegularExpression> <String>)*] [retainname | (newfilename <DriveFileName>) | (replacefilename <REMatchPattern> <RESubstitution>)*]
[stripnameprefix <String>] [stripnameprefix <String>]
[timestamp [<Boolean>]] [timeformat <String>] [timestamp [<Boolean>]] [timeformat <String>]
<DriveFileUpdateAttribute>* <DriveFileUpdateAttribute>*
@ -6562,7 +6565,7 @@ gam <UserTypeEntity> update drivefile <DriveFileEntity> [copy] [returnidonly|ret
(writerscanshare|writerscantshare [<Boolean>]) (writerscanshare|writerscantshare [<Boolean>])
gam <UserTypeEntity> copy drivefile <DriveFileEntity> gam <UserTypeEntity> copy drivefile <DriveFileEntity>
[newfilename <DriveFileName>] (replacefilename <RegularExpression> <String>)* [newfilename <DriveFileName>] (replacefilename <REMatchPattern> <RESubstitution>)*
[stripnameprefix <String>] [stripnameprefix <String>]
[excludetrashed] [excludetrashed]
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) |
@ -6572,11 +6575,11 @@ gam <UserTypeEntity> copy drivefile <DriveFileEntity>
[mergewithparent [<Boolean>]] [recursive [depth <Number>]] [mergewithparent [<Boolean>]] [recursive [depth <Number>]]
<DriveFileCopyAttribute>* <DriveFileCopyAttribute>*
[skipids <DriveFileEntity>] [skipids <DriveFileEntity>]
[copysubfiles [<Boolean>]] [filenamematchpattern <RegularExpression>] [copysubfiles [<Boolean>]] [filenamematchpattern <REMatchPattern>]
[filemimetype [not] <MimeTypeList>] [filemimetype [not] <MimeTypeList>]
[copysubfilesownedby any|me|others] [copysubfilesownedby any|me|others]
[copysubfolders [<Boolean>]] [foldernamematchpattern <RegularExpression>] [copysubfolders [<Boolean>]] [foldernamematchpattern <REMatchPattern>]
[copysubshortcuts [<Boolean>]] [shortcutnamematchpattern <RegularExpression>] [copysubshortcuts [<Boolean>]] [shortcutnamematchpattern <REMatchPattern>]
[duplicatefiles overwriteolder|overwriteall|duplicatename|uniquename|skip] [duplicatefiles overwriteolder|overwriteall|duplicatename|uniquename|skip]
[duplicatefolders merge|duplicatename|uniquename|skip] [duplicatefolders merge|duplicatename|uniquename|skip]
[copiedshortcutspointtocopiedfiles [<Boolean>]] [copiedshortcutspointtocopiedfiles [<Boolean>]]
@ -7157,7 +7160,7 @@ gam <UserTypeEntity> print filecounts [todrive <ToDriveAttribute>*]
[anyowner|(showownedby any|me|others)] [anyowner|(showownedby any|me|others)]
[showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>]
[sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
[filenamematchpattern <RegularExpression>] [filenamematchpattern <REMatchPattern>]
<PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
[excludetrashed] [excludetrashed]
[showsize] [showmimetypesize] [showlastmodification] [showsize] [showmimetypesize] [showlastmodification]
@ -7172,7 +7175,7 @@ gam <UserTypeEntity> show filecounts
[anyowner|(showownedby any|me|others)] [anyowner|(showownedby any|me|others)]
[showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>]
[sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
[filenamematchpattern <RegularExpression>] [filenamematchpattern <REMatchPattern>]
<PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
[excludetrashed] [excludetrashed]
[showsize] [showmimetypesize] [showlastmodification] [showsize] [showmimetypesize] [showlastmodification]
@ -7204,7 +7207,7 @@ gam <UserTypeEntity> print filetree [todrive <ToDriveAttribute>*]
[anyowner|(showownedby any|me|others)] [anyowner|(showownedby any|me|others)]
[showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>]
[sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
[filenamematchpattern <RegularExpression>] [filenamematchpattern <REMatchPattern>]
<PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
[excludetrashed] [excludetrashed]
[fields <FileTreeFieldNameList>] [fields <FileTreeFieldNameList>]
@ -7216,7 +7219,7 @@ gam <UserTypeEntity> show filetree
[anyowner|(showownedby any|me|others)] [anyowner|(showownedby any|me|others)]
[showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>]
[sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
[filenamematchpattern <RegularExpression>] [filenamematchpattern <REMatchPattern>]
<PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
[excludetrashed] [excludetrashed]
[fields <FileTreeFieldNameList>] [fields <FileTreeFieldNameList>]
@ -7237,7 +7240,7 @@ gam <UserTypeEntity> print filelist [todrive <ToDriveAttribute>*]
[anyowner|(showownedby any|me|others)] [anyowner|(showownedby any|me|others)]
[showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] [mimetypeinquery [<Boolean>]] [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] [mimetypeinquery [<Boolean>]]
[sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
[filenamematchpattern <RegularExpression>] [filenamematchpattern <REMatchPattern>]
<PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] [pmfilter] [oneitemperrow] <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] [pmfilter] [oneitemperrow]
[excludetrashed] [excludetrashed]
[maxfiles <Integer>] [nodataheaders <String>] [maxfiles <Integer>] [nodataheaders <String>]
@ -7433,8 +7436,8 @@ gam <UserTypeEntity> update labelsettings <LabelName> [name <String>]
[messagelistvisibility hide|show] [labellistvisibility hide|show|showifunread] [messagelistvisibility hide|show] [labellistvisibility hide|show|showifunread]
[backgroundcolor "<LabelColorHex>|<LabelBackgroundColorHex>|custom:<ColorHex>"] [backgroundcolor "<LabelColorHex>|<LabelBackgroundColorHex>|custom:<ColorHex>"]
[textcolor "<LabelColorHex>|<LabelTextColorHex>|custom:<ColorHex>"] [textcolor "<LabelColorHex>|<LabelTextColorHex>|custom:<ColorHex>"]
gam <UserTypeEntity> update label|labels [search <RegularExpression>] [replace <LabelReplacement>] [merge [keepoldlabel]] gam <UserTypeEntity> update label|labels [search <REMatchPattern>] [replace <LabelReplacement>] [merge [keepoldlabel]]
gam <UserTypeEntity> delete label|labels <LabelName>|regex:<RegularExpression>|--ALL_LABELS-- gam <UserTypeEntity> delete label|labels <LabelName>|regex:<REMatchPattern>|--ALL_LABELS--
gam <UserTypeEntity> delete labellist <LabelNameEntity> gam <UserTypeEntity> delete labellist <LabelNameEntity>
gam <UserTypeEntity> delete labelid <LabelID> gam <UserTypeEntity> delete labelid <LabelID>
gam <UserTypeEntity> delete labelidlist <LabelIDEntity> gam <UserTypeEntity> delete labelidlist <LabelIDEntity>
@ -7550,14 +7553,14 @@ gam <UserTypeEntity> print labels|label [todrive <ToDriveAttribute>*]
gam <UserTypeEntity> draft message gam <UserTypeEntity> draft message
<MessageContent> <MessageContent>
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
(<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)* (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
(attach <FileName> [charset <Charset>])* (attach <FileName> [charset <Charset>])*
(embedimage <FileName> <String>)* (embedimage <FileName> <String>)*
gam <UserTypeEntity> import message gam <UserTypeEntity> import message
<MessageContent> <MessageContent>
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
(<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)* (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
(addlabel <LabelName>)* [labels <LabelNameList>] (addlabel <LabelName>)* [labels <LabelNameList>]
(attach <FileName> [charset <Charset>])* (attach <FileName> [charset <Charset>])*
@ -7566,7 +7569,7 @@ gam <UserTypeEntity> import message
gam <UserTypeEntity> insert message gam <UserTypeEntity> insert message
<MessageContent> <MessageContent>
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
(<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)* (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
(addlabel <LabelName>)* [labels <LabelNameList>] (addlabel <LabelName>)* [labels <LabelNameList>]
(attach <FileName> [charset <Charset>])* (attach <FileName> [charset <Charset>])*
@ -7618,25 +7621,25 @@ gam <UserTypeEntity> forward thread|thtreads recipient|to <RecipientEntity>
gam <UserTypeEntity> show messages|threads gam <UserTypeEntity> show messages|threads
(((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])*
[quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>) [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>)
[labelmatchpattern <RegularExpression>] [sendermatchpattern <RegularExpression>] [labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
[countsonly|positivecountsonly] [useronly] [countsonly|positivecountsonly] [useronly]
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]] [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet] [showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
[maxmessagesperthread <Number>] [maxmessagesperthread <Number>]
[[attachmentnamepattern <RegularExpression>] [[attachmentnamepattern <REMatchPattern>]
[showattachments [noshowtextplain]] [showattachments [noshowtextplain]]
[saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]] [saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]]
[uploadattachments [<DriveFileParentAttribute>]]] [uploadattachments [<DriveFileParentAttribute>]]]
gam <UserTypeEntity> print messages|threads [todrive <ToDriveAttribute>*] gam <UserTypeEntity> print messages|threads [todrive <ToDriveAttribute>*]
(((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])*
[quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>) [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>)
[labelmatchpattern <RegularExpression>] [sendermatchpattern <RegularExpression>] [labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
[countsonly|positivecountsonly] [useronly] [countsonly|positivecountsonly] [useronly]
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String> [dateheaderconverttimezone [<Boolean>]]] [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String> [dateheaderconverttimezone [<Boolean>]]]
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet] [showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
[maxmessagesperthread <Number>] [maxmessagesperthread <Number>]
[convertcrnl] [delimiter <Character>] [convertcrnl] [delimiter <Character>]
[[attachmentnamepattern <RegularExpression>] [[attachmentnamepattern <REMatchPattern>]
[showattachments [noshowtextplain]]] [showattachments [noshowtextplain]]]
(addcsvdata <FieldName> <String>)* (addcsvdata <FieldName> <String>)*
@ -7650,7 +7653,7 @@ gam <UserTypeEntity> print gmailprofile [todrive <ToDriveAttribute>*]
gam <UserTypeEntity> [create|add] sendas <EmailAddress> [name] <String> gam <UserTypeEntity> [create|add] sendas <EmailAddress> [name] <String>
[<SendAsContent> [<SendAsContent>
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*] (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
[html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>] [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
[smtpmsa.host <SMTPHostName> smtpmsa.port 25|465|587 [smtpmsa.host <SMTPHostName> smtpmsa.port 25|465|587
smtpmsa.username <UserName> smtpmsa.password <Password> smtpmsa.username <UserName> smtpmsa.password <Password>
@ -7658,7 +7661,7 @@ gam <UserTypeEntity> [create|add] sendas <EmailAddress> [name] <String>
gam <UserTypeEntity> update sendas <EmailAddress> [name <String>] gam <UserTypeEntity> update sendas <EmailAddress> [name <String>]
[<SendAsContent> [<SendAsContent>
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*] (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
[html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>] [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
gam <UserTypeEntity> delete sendas <EmailAddressEntity> gam <UserTypeEntity> delete sendas <EmailAddressEntity>
gam <UserTypeEntity> info sendas <EmailAddressEntity> [compact|format|html] gam <UserTypeEntity> info sendas <EmailAddressEntity> [compact|format|html]
@ -7670,7 +7673,7 @@ gam <UserTypeEntity> print sendas [compact]
gam <UserTypeEntity> signature|sig gam <UserTypeEntity> signature|sig
<SignatureContent> <SignatureContent>
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
[html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>] [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
[name <String>] [name <String>]
[primary] [primary]
@ -7682,7 +7685,7 @@ gam <UserTypeEntity> print signature [compact]
gam <UserTypeEntity> vacation [<Boolean>] [subject <String>] gam <UserTypeEntity> vacation [<Boolean>] [subject <String>]
[<VacationMessageContent> [<VacationMessageContent>
(replace <Tag> <UserReplacement>)* (replace <Tag> <UserReplacement>)*
(replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*] (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
[html [<Boolean>]] [contactsonly [<Boolean>]] [domainonly [<Boolean>]] [html [<Boolean>]] [contactsonly [<Boolean>]] [domainonly [<Boolean>]]
[start|startdate <Date>|Started] [end|enddate <Date>|NotSpecified] [start|startdate <Date>|Started] [end|enddate <Date>|NotSpecified]
gam <UserTypeEntity> show vacation [compact|format|html] [enabledonly] gam <UserTypeEntity> show vacation [compact|format|html] [enabledonly]
@ -7761,7 +7764,7 @@ gam <UserTypeEntity> add group|groups
([<GroupRole>] [[delivery] <DeliverySetting>] <GroupEntity>)+ ([<GroupRole>] [[delivery] <DeliverySetting>] <GroupEntity>)+
gam <UserTypeEntity> delete group|groups gam <UserTypeEntity> delete group|groups
[(domain <DomainName>)|(customerid <CustomerID>)| [(domain <DomainName>)|(customerid <CustomerID>)|
(emailmatchpattern [not] <RegularExpression>)|<GroupEntity>] (emailmatchpattern [not] <REMatchPattern>)|<GroupEntity>]
gam <UserTypeEntity> update group|groups gam <UserTypeEntity> update group|groups
[(domain <DomainName>)|(customerid <CustomerID>)]) [<GroupRole>] [[delivery] <DeliverySetting>] [(domain <DomainName>)|(customerid <CustomerID>)]) [<GroupRole>] [[delivery] <DeliverySetting>]
([<GroupRole>] [[delivery] <DeliverySetting>] [<GroupEntity>])* ([<GroupRole>] [[delivery] <DeliverySetting>] [<GroupEntity>])*
@ -8034,7 +8037,7 @@ gam <UserItem> print meettranscripts <MeetConferenceName> [todrive <ToDriveAttri
<PeopleUserContactSelection> ::= <PeopleUserContactSelection> ::=
[(selectcontactgroup <PeopleContactGroupItem>)| [(selectcontactgroup <PeopleContactGroupItem>)|
[query <QueryContact>]] [query <QueryContact>]]
[emailmatchpattern <RegularExpression> [emailmatchtype work|home|other|<String>]] [emailmatchpattern <REMatchPattern> [emailmatchtype work|home|other|<String>]]
gam <UserTypeEntity> create contact gam <UserTypeEntity> create contact
[<PeopleContactAttribute>+] [<PeopleContactAttribute>+]
@ -8049,7 +8052,7 @@ gam <UserTypeEntity> delete contacts
gam <UserTypeEntity> clear contacts gam <UserTypeEntity> clear contacts
<PeopleResourceNameEntity>|<PeopleUserContactSelection> <PeopleResourceNameEntity>|<PeopleUserContactSelection>
[emailclearpattern <RegularExpression>] [emailcleartype work|home|other|<String>] [emailclearpattern <REMatchPattern>] [emailcleartype work|home|other|<String>]
[delete_cleared_contacts_with_no_emails] [delete_cleared_contacts_with_no_emails]
gam <UserTypeEntity> dedup contacts gam <UserTypeEntity> dedup contacts
@ -8077,7 +8080,7 @@ gam <UserTypeEntity> info contacts
<PeoplePrintShowUserContactSelection> ::= <PeoplePrintShowUserContactSelection> ::=
[(selectcontactgroup <PeopleContactGroupItem>)|(filtercontactgroup <PeopleContactGroupItem>)| [(selectcontactgroup <PeopleContactGroupItem>)|(filtercontactgroup <PeopleContactGroupItem>)|
([query <QueryContact>] [selectmaincontacts|selectothercontacts])] ([query <QueryContact>] [selectmaincontacts|selectothercontacts])]
[emailmatchpattern <RegularExpression> [emailmatchtype work|home|other|<String>]] [emailmatchpattern <REMatchPattern> [emailmatchtype work|home|other|<String>]]
gam <UserTypeEntity> show contacts gam <UserTypeEntity> show contacts
<PeoplePrintShowUserContactSelection> <PeoplePrintShowUserContactSelection>
@ -8100,7 +8103,7 @@ gam <UserTypeEntity> print contacts [todrive <ToDriveAttribute>*]
<OtherContactsSelection> ::= <OtherContactsSelection> ::=
[query <QueryContact>] [query <QueryContact>]
[emailmatchpattern <RegularExpression> [emailmatchtype work|home|other|<String>]] [emailmatchpattern <REMatchPattern> [emailmatchtype work|home|other|<String>]]
gam <UserTypeEntity> copy othercontacts gam <UserTypeEntity> copy othercontacts
<OtherContactsResourceNameEntity>|<OtherContactsSelection> <OtherContactsResourceNameEntity>|<OtherContactsSelection>
@ -8310,13 +8313,13 @@ gam <UserTypeEntity> show shareddriveinfo <SharedDriveEntity> [fields <SharedDri
[formatjson] [formatjson]
gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*] gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*]
[adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]] [adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
(role|roles <SharedDriveACLRoleList>)* (role|roles <SharedDriveACLRoleList>)*
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]] [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
[formatjson [quotechar <Character>]] [formatjson [quotechar <Character>]]
gam <UserTypeEntity> show shareddrives gam <UserTypeEntity> show shareddrives
[adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]] [adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]]
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
(role|roles <SharedDriveACLRoleList>)* (role|roles <SharedDriveACLRoleList>)*
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]] [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
[formatjson] [formatjson]

View File

@ -1,3 +1,12 @@
7.05.22
Updated progress messages for `gam <UserTypeEntity> print filelist|filecounts|filesharecounts|filetree select shareddriveid <SharedDriveID>`
to display the ID of the SharedDrive that is being accessed.
```
Getting all Drive Files/Folders for user@domain.com on Shared Drive ID: <SharedDriveID
Got 33 Drive Files/Folders for user@domain.com on Shared Drive ID: <SharedDriveID>...
```
7.05.21 7.05.21
Fixed bug in `gam update chromepolicy` that generated an error like the following Fixed bug in `gam update chromepolicy` that generated an error like the following

View File

@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
""" """
__author__ = 'GAM Team <google-apps-manager@googlegroups.com>' __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
__version__ = '7.05.21' __version__ = '7.05.22'
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)' __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
#pylint: disable=wrong-import-position #pylint: disable=wrong-import-position
@ -1723,15 +1723,18 @@ def getREPattern(flags=0):
return validateREPattern(patstr, flags) return validateREPattern(patstr, flags)
missingArgumentExit(Cmd.OB_RE_PATTERN) missingArgumentExit(Cmd.OB_RE_PATTERN)
def getREPatternReplacement(flags=0): def validateREPatternSubstitution(pattern, replacement):
pattern = getREPattern(flags)
replacement = getString(Cmd.OB_STRING, minLen=0)
try: try:
re.sub(pattern, replacement, '') re.sub(pattern, replacement, '')
return (pattern, replacement) return (pattern, replacement)
except re.error as e: except re.error as e:
Cmd.Backup() Cmd.Backup()
usageErrorExit(f'{Cmd.OB_RE_REPLACEMENT} {Msg.ERROR}: {e}') usageErrorExit(f'{Cmd.OB_RE_SUBSTITUTION} {Msg.ERROR}: {e}')
def getREPatternSubstitution(flags=0):
pattern = getREPattern(flags)
replacement = getString(Cmd.OB_RE_SUBSTITUTION, minLen=0)
return validateREPatternSubstitution(pattern, replacement)
def getSheetEntity(allowBlankSheet): def getSheetEntity(allowBlankSheet):
if Cmd.ArgumentsRemaining(): if Cmd.ArgumentsRemaining():
@ -6816,9 +6819,9 @@ def getEntitiesFromCSVFile(shlexSplit, returnSet=False):
return entityList if not returnSet else entitySet return entityList if not returnSet else entitySet
# <CSVFileSelector> # <CSVFileSelector>
# keyfield <FieldName> [keypattern <RegularExpression>] [keyvalue <String>] [delimiter <Character>] # keyfield <FieldName> [keypattern <RESearchPattern>] [keyvalue <RESubstitution>] [delimiter <Character>]
# subkeyfield <FieldName> [keypattern <RegularExpression>] [keyvalue <String>] [delimiter <Character>] # subkeyfield <FieldName> [keypattern <RESearchPattern>] [keyvalue <RESubstitution>] [delimiter <Character>]
# (matchfield|skipfield <FieldName> <RegularExpression>)* # (matchfield|skipfield <FieldName> <RESearchPattern>)*
# [datafield <FieldName>(:<FieldName>)* [delimiter <Character>]] # [datafield <FieldName>(:<FieldName>)* [delimiter <Character>]]
def getEntitiesFromCSVbyField(): def getEntitiesFromCSVbyField():
@ -10339,7 +10342,7 @@ def processSubFields(GAM_argv, row, subFields):
# gam csv <CSVLoopContent> [warnifnodata] # gam csv <CSVLoopContent> [warnifnodata]
# [columndelimiter <Character>] [quotechar <Character>] [fields <FieldNameList>] # [columndelimiter <Character>] [quotechar <Character>] [fields <FieldNameList>]
# (matchfield|skipfield <FieldName> <RegularExpression>)* [showcmds [<Boolean>]] # (matchfield|skipfield <FieldName> <RESearchPattern>)* [showcmds [<Boolean>]]
# [skiprows <Integer>] [maxrows <Integer>] # [skiprows <Integer>] [maxrows <Integer>]
# gam <GAM argument list> # gam <GAM argument list>
def doCSV(testMode=False): def doCSV(testMode=False):
@ -10395,7 +10398,7 @@ def doCSVTest():
# gam loop <CSVLoopContent> [warnifnodata] # gam loop <CSVLoopContent> [warnifnodata]
# [columndelimiter <Character>] [quotechar <Character>] [fields <FieldNameList>] # [columndelimiter <Character>] [quotechar <Character>] [fields <FieldNameList>]
# (matchfield|skipfield <FieldName> <RegularExpression>)* [showcmds [<Boolean>]] # (matchfield|skipfield <FieldName> <RESearchPattern>)* [showcmds [<Boolean>]]
# [skiprows <Integer>] [maxrows <Integer>] # [skiprows <Integer>] [maxrows <Integer>]
# gam <GAM argument list> # gam <GAM argument list>
def doLoop(loopCmd): def doLoop(loopCmd):
@ -14531,7 +14534,7 @@ def _getTagReplacement(myarg, tagReplacements, allowSubs):
if myarg == 'replace': if myarg == 'replace':
trregex = None trregex = None
elif myarg == 'replaceregex': elif myarg == 'replaceregex':
trregex = getREPatternReplacement(re.IGNORECASE) trregex = getREPatternSubstitution(re.IGNORECASE)
else: else:
return False return False
matchTag = getString(Cmd.OB_TAG) matchTag = getString(Cmd.OB_TAG)
@ -14950,7 +14953,7 @@ def getRecipients():
# [subject <String>] # [subject <String>]
# [<MessageContent>] # [<MessageContent>]
# (replace <Tag> <String>)* # (replace <Tag> <String>)*
# (replaceregex <RegularExpression> <String> <Tag> <String>)* # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <String>)*
# [html [<Boolean>]] (attach <FileName> [charset <CharSet>])* # [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
# (embedimage <FileName> <String>)* # (embedimage <FileName> <String>)*
# [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>] # [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@ -14960,7 +14963,7 @@ def getRecipients():
# [subject <String>] # [subject <String>]
# [<MessageContent>] # [<MessageContent>]
# (replace <Tag> <String>)* # (replace <Tag> <String>)*
# (replaceregex <RegularExpression> <String> <Tag> <String>)* # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <String>)*
# [html [<Boolean>]] (attach <FileName> [charset <CharSet>])* # [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
# (embedimage <FileName> <String>)* # (embedimage <FileName> <String>)*
# [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>] # [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@ -14970,7 +14973,7 @@ def getRecipients():
# [subject <String>] # [subject <String>]
# [<MessageContent>] # [<MessageContent>]
# (replace <Tag> <String>)* # (replace <Tag> <String>)*
# (replaceregex <RegularExpression> <String> <Tag> <String>)* # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <String>)*
# [html [<Boolean>]] (attach <FileName> [charset <CharSet>])* # [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
# (embedimage <FileName> <String>)* # (embedimage <FileName> <String>)*
# [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>] # [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@ -18644,7 +18647,7 @@ def userFilters(kwargs, query, orgUnitPath, isSuspended):
# [limittoou <OrgUnitItem>]) # [limittoou <OrgUnitItem>])
# [user|users <EmailAddressList>] [group|groups <EmailAddressList>] # [user|users <EmailAddressList>] [group|groups <EmailAddressList>]
# [select <UserTypeEntity>] # [select <UserTypeEntity>]
# [issuspended <Boolean>] [aliasmatchpattern <RegularExpression>] # [issuspended <Boolean>] [aliasmatchpattern <REMatchPattern>]
# [shownoneditable] [nogroups] [nousers] # [shownoneditable] [nogroups] [nousers]
# [onerowpertarget] [delimiter <Character>] # [onerowpertarget] [delimiter <Character>]
# [suppressnoaliasrows] # [suppressnoaliasrows]
@ -20111,7 +20114,7 @@ def _clearUpdateContacts(updateContacts):
Ind.Decrement() Ind.Decrement()
# gam clear contacts <ContactEntity>|<ContactSelection> # gam clear contacts <ContactEntity>|<ContactSelection>
# [clearmatchpattern <RegularExpression>] [clearmatchtype work|home|other|<String>] # [clearmatchpattern <REMatchPattern>] [clearmatchtype work|home|other|<String>]
# [deleteclearedcontactswithnoemails] # [deleteclearedcontactswithnoemails]
def doClearDomainContacts(): def doClearDomainContacts():
_clearUpdateContacts(False) _clearUpdateContacts(False)
@ -21676,7 +21679,7 @@ def _clearUpdatePeopleContacts(users, updateContacts):
Ind.Decrement() Ind.Decrement()
# gam <UserTypeEntity> clear contacts <PeopleResourceNameEntity>|<PeopleUserContactSelection> # gam <UserTypeEntity> clear contacts <PeopleResourceNameEntity>|<PeopleUserContactSelection>
# [emailclearpattern <RegularExpression>] [emailcleartype work|home|other|<String>] # [emailclearpattern <REMatchPattern>] [emailcleartype work|home|other|<String>]
# [deleteclearedcontactswithnoemails] # [deleteclearedcontactswithnoemails]
def clearUserPeopleContacts(users): def clearUserPeopleContacts(users):
_clearUpdatePeopleContacts(users, False) _clearUpdatePeopleContacts(users, False)
@ -31956,7 +31959,7 @@ GROUP_PREVIEW_TITLES = ['group', 'email', 'role', 'action', 'message']
# gam update groups <GroupEntity> clear [member] [manager] [owner] # gam update groups <GroupEntity> clear [member] [manager] [owner]
# [usersonly|groupsonly] # [usersonly|groupsonly]
# [notsuspended|suspended] [notarchived|archived] # [notsuspended|suspended] [notarchived|archived]
# [emailclearpattern|emailretainpattern <RegularExpression>] # [emailclearpattern|emailretainpattern <REMatchPattern>]
# [removedomainnostatusmembers] # [removedomainnostatusmembers]
# [preview] [actioncsv] # [preview] [actioncsv]
def doUpdateGroups(): def doUpdateGroups():
@ -33305,7 +33308,7 @@ def infoGroups(entityList):
# [internal] [internaldomains <DomainList>] [external] # [internal] [internaldomains <DomainList>] [external]
# [notsuspended|suspended] [notarchived|archived] # [notsuspended|suspended] [notarchived|archived]
# [types <GroupMemberTypeList>] # [types <GroupMemberTypeList>]
# [memberemaildisplaypattern|memberemailskippattern <RegularExpression>] # [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
# [formatjson] # [formatjson]
def doInfoGroups(): def doInfoGroups():
infoGroups(getEntityList(Cmd.OB_GROUP_ENTITY)) infoGroups(getEntityList(Cmd.OB_GROUP_ENTITY))
@ -33516,8 +33519,8 @@ PRINT_GROUPS_JSON_TITLES = ['email', 'JSON']
# [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryUserList>)]))| # [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryUserList>)]))|
# (group|group_ns|group_susp <GroupItem>)| # (group|group_ns|group_susp <GroupItem>)|
# (select <GroupEntity>)] # (select <GroupEntity>)]
# [emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] # [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
# [descriptionmatchpattern [not] <RegularExpression>] (matchsetting [not] <GroupAttribute>)* # [descriptionmatchpattern [not] <REMatchPattern>] (matchsetting [not] <GroupAttribute>)*
# [admincreatedmatch <Boolean>] # [admincreatedmatch <Boolean>]
# [maxresults <Number>] # [maxresults <Number>]
# [allfields|([basic] [settings] <GroupFieldName>* [fields <GroupFieldNameList>])] # [allfields|([basic] [settings] <GroupFieldName>* [fields <GroupFieldNameList>])]
@ -33529,7 +33532,7 @@ PRINT_GROUPS_JSON_TITLES = ['email', 'JSON']
# [includederivedmembership] # [includederivedmembership]
# [notsuspended|suspended] [notarchived|archived] # [notsuspended|suspended] [notarchived|archived]
# [types <GroupMemberTypeList>] # [types <GroupMemberTypeList>]
# [memberemaildisplaypattern|memberemailskippattern <RegularExpression>] # [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
# [convertcrnl] [delimiter <Character>] [sortheaders] # [convertcrnl] [delimiter <Character>] [sortheaders]
# [formatjson [quotechar <Character>]] # [formatjson [quotechar <Character>]]
# [showitemcountonly] # [showitemcountonly]
@ -34218,13 +34221,13 @@ GROUPMEMBERS_DEFAULT_FIELDS = ['group', 'type', 'role', 'id', 'status', 'email']
# [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryUserList>)]))| # [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryUserList>)]))|
# (group|group_ns|group_susp <GroupItem>)| # (group|group_ns|group_susp <GroupItem>)|
# (select <GroupEntity>)] # (select <GroupEntity>)]
# [emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] # [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
# [descriptionmatchpattern [not] <RegularExpression>] # [descriptionmatchpattern [not] <REMatchPattern>]
# [roles <GroupRoleList>] [members] [managers] [owners] # [roles <GroupRoleList>] [members] [managers] [owners]
# [internal] [internaldomains <DomainList>] [external] # [internal] [internaldomains <DomainList>] [external]
# [notsuspended|suspended] [notarchived|archived] # [notsuspended|suspended] [notarchived|archived]
# [types <GroupMemberTypeList>] # [types <GroupMemberTypeList>]
# [memberemaildisplaypattern|memberemailskippattern <RegularExpression>] # [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
# [membernames] [showdeliverysettings] # [membernames] [showdeliverysettings]
# <MembersFieldName>* [fields <MembersFieldNameList>] # <MembersFieldName>* [fields <MembersFieldNameList>]
# [userfields <UserFieldNameList>] # [userfields <UserFieldNameList>]
@ -34518,13 +34521,13 @@ def doPrintGroupMembers():
# [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryUserList>)]))| # [([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryUserList>)]))|
# (group|group_ns|group_susp <GroupItem>)| # (group|group_ns|group_susp <GroupItem>)|
# (select <GroupEntity>)] # (select <GroupEntity>)]
# [emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] # [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
# [descriptionmatchpattern [not] <RegularExpression>] # [descriptionmatchpattern [not] <REMatchPattern>]
# [roles <GroupRoleList>] [members] [managers] [owners] [depth <Number>] # [roles <GroupRoleList>] [members] [managers] [owners] [depth <Number>]
# [internal] [internaldomains <DomainList>] [external] # [internal] [internaldomains <DomainList>] [external]
# [notsuspended|suspended] [notarchived|archived] # [notsuspended|suspended] [notarchived|archived]
# [types <GroupMemberTypeList>] # [types <GroupMemberTypeList>]
# [memberemaildisplaypattern|memberemailskippattern <RegularExpression>] # [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
# [includederivedmembership] # [includederivedmembership]
def doShowGroupMembers(): def doShowGroupMembers():
def _roleOrder(key): def _roleOrder(key):
@ -34783,7 +34786,7 @@ def doCreateCIGroup():
# <UserTypeEntity> # <UserTypeEntity>
# gam update cigroups <GroupEntity> clear [member] [manager] [owner] # gam update cigroups <GroupEntity> clear [member] [manager] [owner]
# [usersonly|groupsonly] # [usersonly|groupsonly]
# [emailclearpattern|emailretainpattern <RegularExpression>] # [emailclearpattern|emailretainpattern <REMatchPattern>]
# [preview] [actioncsv] # [preview] [actioncsv]
def doUpdateCIGroups(): def doUpdateCIGroups():
@ -35505,7 +35508,7 @@ def getCIGroupMemberTypes(myarg, typesSet):
# [roles <GroupRoleList>] [members] [managers] [owners] # [roles <GroupRoleList>] [members] [managers] [owners]
# [internal] [internaldomains <DomainList>] [external] # [internal] [internaldomains <DomainList>] [external]
# [types <CIGroupMemberTypeList>] # [types <CIGroupMemberTypeList>]
# [memberemaildisplaypattern|memberemailskippattern <RegularExpression>] # [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
# [formatjson] # [formatjson]
def doInfoCIGroups(): def doInfoCIGroups():
def printCIGroupMemberTree(group_id, showRole): def printCIGroupMemberTree(group_id, showRole):
@ -35842,11 +35845,11 @@ def doInfoCIPolicies():
# gam print policies [todrive <ToDriveAttribute>*] # gam print policies [todrive <ToDriveAttribute>*]
# [filter <String>] [nowarnings] [noappnames] # [filter <String>] [nowarnings] [noappnames]
# [group <RegularExpression>] [ou|org|orgunit <RegularExpression>] # [group <REMatchPattern>] [ou|org|orgunit <REMatchPattern>]
# [formatjson [quotechar <Character>]] # [formatjson [quotechar <Character>]]
# gam show policies # gam show policies
# [filter <String>] [nowarnings] [noappnames] # [filter <String>] [nowarnings] [noappnames]
# [group <RegularExpression>] [ou|org|orgunit <RegularExpression>] # [group <REMatchPattern>] [ou|org|orgunit <REMatchPattern>]
# [formatjson] # [formatjson]
def doPrintShowCIPolicies(): def doPrintShowCIPolicies():
@ -35906,14 +35909,14 @@ PRINT_CIGROUPS_JSON_TITLES = ['email', 'JSON']
# gam print cigroups [todrive <ToDriveAttribute>*] # gam print cigroups [todrive <ToDriveAttribute>*]
# [(cimember|ciowner <UserItem>)|(select <GroupEntity>)|(query <String>)] # [(cimember|ciowner <UserItem>)|(select <GroupEntity>)|(query <String>)]
# [showownedby <UserItem>] # [showownedby <UserItem>]
# [emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] # [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
# [descriptionmatchpattern [not] <RegularExpression>] # [descriptionmatchpattern [not] <REMatchPattern>]
# [basic|allfields|(<CIGroupFieldName>* [fields <CIGroupFieldNameList>])] # [basic|allfields|(<CIGroupFieldName>* [fields <CIGroupFieldNameList>])]
# [roles <GroupRoleList>] [memberrestrictions] # [roles <GroupRoleList>] [memberrestrictions]
# [members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly] # [members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly]
# [internal] [internaldomains <DomainList>] [external] # [internal] [internaldomains <DomainList>] [external]
# [types <CIGroupMemberTypeList>] # [types <CIGroupMemberTypeList>]
# [memberemaildisplaypattern|memberemailskippattern <RegularExpression>] # [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
# [convertcrnl] [delimiter <Character>] # [convertcrnl] [delimiter <Character>]
# [formatjson [quotechar <Character>]] # [formatjson [quotechar <Character>]]
# [showitemcountonly] # [showitemcountonly]
@ -36360,11 +36363,11 @@ def _getCIListGroupMembersArgs(listView):
# gam print cigroup-members [todrive <ToDriveAttribute>*] # gam print cigroup-members [todrive <ToDriveAttribute>*]
# [(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)] # [(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
# [showownedby <UserItem>] # [showownedby <UserItem>]
# [emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] # [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
# [descriptionmatchpattern [not] <RegularExpression>] # [descriptionmatchpattern [not] <REMatchPattern>]
# [roles <GroupRoleList>] [members] [managers] [owners] # [roles <GroupRoleList>] [members] [managers] [owners]
# [types <CIGroupMemberTypeList>] # [types <CIGroupMemberTypeList>]
# [memberemaildisplaypattern|memberemailskippattern <RegularExpression>] # [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
# <CIGroupMembersFieldName>* [fields <CIGroupMembersFieldNameList>] # <CIGroupMembersFieldName>* [fields <CIGroupMembersFieldNameList>]
# [minimal|basic|full] # [minimal|basic|full]
# [(recursive [noduplicates])|includederivedmembership] [nogroupeemail] # [(recursive [noduplicates])|includederivedmembership] [nogroupeemail]
@ -36531,12 +36534,12 @@ def doPrintCIGroupMembers():
# gam show cigroup-members # gam show cigroup-members
# [(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)] # [(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
# [showownedby <UserItem>] # [showownedby <UserItem>]
# [emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>] # [emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
# [descriptionmatchpattern [not] <RegularExpression>] # [descriptionmatchpattern [not] <REMatchPattern>]
# [roles <GroupRoleList>] [members] [managers] [owners] # [roles <GroupRoleList>] [members] [managers] [owners]
# [internal] [internaldomains <DomainList>] [external] # [internal] [internaldomains <DomainList>] [external]
# [types <CIGroupMemberTypeList>] # [types <CIGroupMemberTypeList>]
# [memberemaildisplaypattern|memberemailskippattern <RegularExpression>] # [memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
# [minimal|basic|full] # [minimal|basic|full]
# [(depth <Number>) | includederivedmembership] # [(depth <Number>) | includederivedmembership]
def doShowCIGroupMembers(): def doShowCIGroupMembers():
@ -38564,7 +38567,7 @@ def _getCalendarEventAttribute(myarg, body, parameters, function):
elif myarg == 'description': elif myarg == 'description':
body['description'] = getStringWithCRsNLs() body['description'] = getStringWithCRsNLs()
elif function == 'update' and myarg == 'replacedescription': elif function == 'update' and myarg == 'replacedescription':
parameters['replaceDescription'].append(getREPatternReplacement(re.IGNORECASE)) parameters['replaceDescription'].append(getREPatternSubstitution(re.IGNORECASE))
elif myarg == 'location': elif myarg == 'location':
body['location'] = getString(Cmd.OB_STRING, minLen=0) body['location'] = getString(Cmd.OB_STRING, minLen=0)
elif myarg == 'source': elif myarg == 'source':
@ -41089,11 +41092,11 @@ def md5MatchesFile(filename, expected_md5, j=0, jcount=0):
# gam copy vaultexport|export <ExportItem> matter <MatterItem> # gam copy vaultexport|export <ExportItem> matter <MatterItem>
# [targetbucket <String>] [targetprefix <String>] # [targetbucket <String>] [targetprefix <String>]
# [bucketmatchpattern <RegularExpression>] [objectmatchpattern <RegularExpression>] # [bucketmatchpattern <REMatchPattern>] [objectmatchpattern <REMatchPattern>]
# [copyattempts <Integer>] [retryinterval <Integer>] # [copyattempts <Integer>] [retryinterval <Integer>]
# gam copy vaultexport|export <MatterItem> <ExportItem> # gam copy vaultexport|export <MatterItem> <ExportItem>
# [targetbucket <String>] [targetprefix <String>] # [targetbucket <String>] [targetprefix <String>]
# [bucketmatchpattern <RegularExpression>] [objectmatchpattern <RegularExpression>] # [bucketmatchpattern <REMatchPattern>] [objectmatchpattern <REMatchPattern>]
# [copyattempts <Integer>] [retryinterval <Integer>] # [copyattempts <Integer>] [retryinterval <Integer>]
def doCopyVaultExport(): def doCopyVaultExport():
v = buildGAPIObject(API.VAULT) v = buildGAPIObject(API.VAULT)
@ -41158,11 +41161,11 @@ ZIP_EXTENSION_PATTERN = re.compile(r'^.*\.zip$', re.IGNORECASE)
# gam download vaultexport|export <ExportItem> matter <MatterItem> # gam download vaultexport|export <ExportItem> matter <MatterItem>
# [targetfolder <FilePath>] [targetname <FileName>] [noverify] [noextract] [ziptostdout] # [targetfolder <FilePath>] [targetname <FileName>] [noverify] [noextract] [ziptostdout]
# [bucketmatchpattern <RegularExpression>] [objectmatchpattern <RegularExpression>] # [bucketmatchpattern <REMatchPattern>] [objectmatchpattern <REMatchPattern>]
# [downloadattempts <Integer>] [retryinterval <Integer>] # [downloadattempts <Integer>] [retryinterval <Integer>]
# gam download vaultexport|export <MatterItem> <ExportItem> # gam download vaultexport|export <MatterItem> <ExportItem>
# [targetfolder <FilePath>] [targetname <FileName>] [noverify] [noextract] [ziptostdout] # [targetfolder <FilePath>] [targetname <FileName>] [noverify] [noextract] [ziptostdout]
# [bucketmatchpattern <RegularExpression>] [objectmatchpattern <RegularExpression>] # [bucketmatchpattern <REMatchPattern>] [objectmatchpattern <REMatchPattern>]
# [downloadattempts <Integer>] [retryinterval <Integer>] # [downloadattempts <Integer>] [retryinterval <Integer>]
def doDownloadVaultExport(): def doDownloadVaultExport():
def extract_nested_zip(zippedFile): def extract_nested_zip(zippedFile):
@ -42904,18 +42907,7 @@ def getUserAttributes(cd, updateCmd, noUid=False):
elif updateCmd and myarg == 'updateoufromgroup': elif updateCmd and myarg == 'updateoufromgroup':
groupOrgUnitMap = _getGroupOrgUnitMap() groupOrgUnitMap = _getGroupOrgUnitMap()
elif updateCmd and myarg == 'updateprimaryemail': elif updateCmd and myarg == 'updateprimaryemail':
search = getString(Cmd.OB_RE_PATTERN) updatePrimaryEmail = getREPatternSubstitution(re.IGNORECASE)
pattern = validateREPattern(search, re.IGNORECASE)
replace = getString(Cmd.OB_EMAIL_REPLACEMENT)
patternGroups = pattern.groups
replSubs = REPLACE_GROUP_PATTERN.findall(replace)
for replSub in replSubs:
if int(replSub) > patternGroups:
Cmd.Backup()
usageErrorExit(Msg.MISMATCH_RE_SEARCH_REPLACE_SUBFIELDS.format(pattern.groups, search, int(replSub), replace))
updatePrimaryEmail['search'] = search
updatePrimaryEmail['pattern'] = pattern
updatePrimaryEmail['replace'] = replace
elif myarg == 'json': elif myarg == 'json':
body.update(getJSON(USER_JSON_SKIP_FIELDS)) body.update(getJSON(USER_JSON_SKIP_FIELDS))
if 'name' in body and 'fullName' in body['name']: if 'name' in body and 'fullName' in body['name']:
@ -43286,7 +43278,7 @@ def createUserAddAliases(cd, user, aliasList, i, count):
# [replyto <EmailAaddress>] # [replyto <EmailAaddress>]
# [<NotifyMessageContent>] # [<NotifyMessageContent>]
# (replace <Tag> <UserReplacement>)* # (replace <Tag> <UserReplacement>)*
# (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*] # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
# [logpassword <FileName>] [ignorenullpassword] # [logpassword <FileName>] [ignorenullpassword]
# [addnumericsuffixonduplicate <Number>] # [addnumericsuffixonduplicate <Number>]
def doCreateUser(): def doCreateUser():
@ -43374,7 +43366,7 @@ def verifyUserPrimaryEmail(cd, user, createIfNotFound, i, count):
# gam <UserTypeEntity> update user <UserAttribute>* # gam <UserTypeEntity> update user <UserAttribute>*
# [verifynotinvitable|alwaysevict] [noactionifalias] # [verifynotinvitable|alwaysevict] [noactionifalias]
# [updateprimaryemail <RegularExpression> <EmailReplacement>] # [updateprimaryemail <RESEarchPattern> <RESubstitution>]
# [updateoufromgroup <CSVFileInput> [keyfield <FieldName>] [datafield <FieldName>]] # [updateoufromgroup <CSVFileInput> [keyfield <FieldName>] [datafield <FieldName>]]
# [immutableous <OrgUnitEntity>]| # [immutableous <OrgUnitEntity>]|
# [clearschema <SchemaName>|<SchemaNameField>] # [clearschema <SchemaName>|<SchemaNameField>]
@ -43388,7 +43380,7 @@ def verifyUserPrimaryEmail(cd, user, createIfNotFound, i, count):
# [replyto <EmailAaddress>] # [replyto <EmailAaddress>]
# [<NotifyMessageContent> # [<NotifyMessageContent>
# (replace <Tag> <UserReplacement>)* # (replace <Tag> <UserReplacement>)*
# (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*] # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
# [notifyonupdate [<Boolean>]] # [notifyonupdate [<Boolean>]]
# [logpassword <FileName>] [ignorenullpassword] # [logpassword <FileName>] [ignorenullpassword]
def updateUsers(entityList): def updateUsers(entityList):
@ -43431,12 +43423,12 @@ def updateUsers(entityList):
'customType': 'former_employee', 'customType': 'former_employee',
'primary': False, 'address': userPrimary}] 'primary': False, 'address': userPrimary}]
elif updatePrimaryEmail: elif updatePrimaryEmail:
if updatePrimaryEmail['pattern'].search(user) is not None: if updatePrimaryEmail[0].search(user) is not None:
body['primaryEmail'] = updatePrimaryEmail['pattern'].sub(updatePrimaryEmail['replace'], user) body['primaryEmail'] = re.sub(updatePrimaryEmail[0], updatePrimaryEmail[1], user)
else: else:
body.pop('primaryEmail', None) body.pop('primaryEmail', None)
if not body: if not body:
entityActionNotPerformedWarning([Ent.USER, user], Msg.PRIMARY_EMAIL_DID_NOT_MATCH_PATTERN.format(updatePrimaryEmail['search']), i, count) entityActionNotPerformedWarning([Ent.USER, user], Msg.PRIMARY_EMAIL_DID_NOT_MATCH_PATTERN.format(updatePrimaryEmail[0].pattern), i, count)
if groupOrgUnitMap: if groupOrgUnitMap:
try: try:
groups = callGAPIpages(cd.groups(), 'list', 'groups', groups = callGAPIpages(cd.groups(), 'list', 'groups',
@ -44518,7 +44510,7 @@ USERS_INDEXED_TITLES = ['addresses', 'aliases', 'nonEditableAliases', 'emails',
# [userview] [basic|full|allfields | <UserFieldName>* | fields <UserFieldNameList>] # [userview] [basic|full|allfields | <UserFieldName>* | fields <UserFieldNameList>]
# [delimiter <Character>] [sortheaders] [formatjson [quotechar <Character>]] [quoteplusphonenumbers] # [delimiter <Character>] [sortheaders] [formatjson [quotechar <Character>]] [quoteplusphonenumbers]
# [convertcrnl] # [convertcrnl]
# [issuspended <Boolean>] [aliasmatchpattern <RegularExpression>] # [issuspended <Boolean>] [aliasmatchpattern <REMatchPattern>]
# [showitemcountonly] # [showitemcountonly]
# [showvalidcolumn] (addcsvdata <FieldName> <String>)* # [showvalidcolumn] (addcsvdata <FieldName> <String>)*
# #
@ -44531,7 +44523,7 @@ USERS_INDEXED_TITLES = ['addresses', 'aliases', 'nonEditableAliases', 'emails',
# [userview] [basic|full|allfields | <UserFieldName>* | fields <UserFieldNameList>] # [userview] [basic|full|allfields | <UserFieldName>* | fields <UserFieldNameList>]
# [delimiter <Character>] [sortheaders] [formatjson [quotechar <Character>]] [quoteplusphonenumbers] # [delimiter <Character>] [sortheaders] [formatjson [quotechar <Character>]] [quoteplusphonenumbers]
# [convertcrnl] # [convertcrnl]
# [issuspended <Boolean>] [aliasmatchpattern <RegularExpression>] # [issuspended <Boolean>] [aliasmatchpattern <REMatchPattern>]
# [showitemcountonly] # [showitemcountonly]
# [showvalidcolumn] (addcsvdata <FieldName> <String>)* # [showvalidcolumn] (addcsvdata <FieldName> <String>)*
# #
@ -44539,7 +44531,7 @@ USERS_INDEXED_TITLES = ['addresses', 'aliases', 'nonEditableAliases', 'emails',
# ([domain <DomainName>] [(query <QueryUser>)|(queries <QueryUserList>)] # ([domain <DomainName>] [(query <QueryUser>)|(queries <QueryUserList>)]
# [limittoou <OrgUnitItem>] [deleted_only|only_deleted])|[select <UserTypeEntity>] # [limittoou <OrgUnitItem>] [deleted_only|only_deleted])|[select <UserTypeEntity>]
# [formatjson [quotechar <Character>]] [countonly] # [formatjson [quotechar <Character>]] [countonly]
# [issuspended <Boolean>] [aliasmatchpattern <RegularExpression>] # [issuspended <Boolean>] [aliasmatchpattern <REMatchPattern>]
# [showitemcountonly] # [showitemcountonly]
# [showvalidcolumn] (addcsvdata <FieldName> <String>)* # [showvalidcolumn] (addcsvdata <FieldName> <String>)*
# #
@ -47328,7 +47320,7 @@ def _getCoursesInfo(croom, courseSelectionParameters, courseShowProperties, getO
return coursesInfo return coursesInfo
# gam print courses [todrive <ToDriveAttribute>*] (course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>]) # gam print courses [todrive <ToDriveAttribute>*] (course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
# [owneremail] [owneremailmatchpattern <RegularExpression>] # [owneremail] [owneremailmatchpattern <REMatchPattern>]
# [alias|aliases|aliasesincolumns [delimiter <Character>]] # [alias|aliases|aliasesincolumns [delimiter <Character>]]
# [show none|all|students|teachers] [countsonly] # [show none|all|students|teachers] [countsonly]
# [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>] # [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>]
@ -52836,7 +52828,7 @@ def getDriveFileAttribute(myarg, body, parameters, updateCmd):
elif myarg =='stripnameprefix': elif myarg =='stripnameprefix':
parameters[DFA_STRIPNAMEPREFIX] = getString(Cmd.OB_STRING, minLen=0) parameters[DFA_STRIPNAMEPREFIX] = getString(Cmd.OB_STRING, minLen=0)
elif myarg == 'replacefilename': elif myarg == 'replacefilename':
parameters[DFA_REPLACEFILENAME].append(getREPatternReplacement(re.IGNORECASE)) parameters[DFA_REPLACEFILENAME].append(getREPatternSubstitution(re.IGNORECASE))
elif myarg in {'convert', 'ocr'}: elif myarg in {'convert', 'ocr'}:
deprecatedArgument(myarg) deprecatedArgument(myarg)
stderrWarningMsg(Msg.USE_MIMETYPE_TO_SPECIFY_GOOGLE_FORMAT) stderrWarningMsg(Msg.USE_MIMETYPE_TO_SPECIFY_GOOGLE_FORMAT)
@ -55354,6 +55346,12 @@ class DriveListParameters():
def GetFileMatchingPermission(self, fileInfo): def GetFileMatchingPermission(self, fileInfo):
return self.PM.GetMatchingPermissions(fileInfo.get('permissions', [])) return self.PM.GetMatchingPermissions(fileInfo.get('permissions', []))
def _getGettingEntity(user, fileIdEntity):
driveId = fileIdEntity.get('shareddrive', {}).get('driveId', None)
if not driveId:
return user
return f"{user} on {Ent.Singular(Ent.SHAREDDRIVE_ID)}: {driveId}"
OWNED_BY_ME_FIELDS_TITLES = ['ownedByMe'] OWNED_BY_ME_FIELDS_TITLES = ['ownedByMe']
FILELIST_FIELDS_TITLES = ['id', 'name', 'mimeType', 'parents'] FILELIST_FIELDS_TITLES = ['id', 'name', 'mimeType', 'parents']
DRIVE_INDEXED_TITLES = ['parents', 'path', 'permissions'] DRIVE_INDEXED_TITLES = ['parents', 'path', 'permissions']
@ -55384,7 +55382,7 @@ SIZE_FIELD_CHOICE_MAP = {
# [anyowner|(showownedby any|me|others)] # [anyowner|(showownedby any|me|others)]
# [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] [mimetypeinquery [<Boolean>]] # [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] [mimetypeinquery [<Boolean>]]
# [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] # [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
# [filenamematchpattern <RegularExpression>] # [filenamematchpattern <REMatchPattern>]
# <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] [pmfilter] [oneitemperrow] # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] [pmfilter] [oneitemperrow]
# [excludetrashed] # [excludetrashed]
# [maxfiles <Integer>] [nodataheaders <String>] # [maxfiles <Integer>] [nodataheaders <String>]
@ -55882,7 +55880,8 @@ def printFileList(users):
mimeTypeInfo = {} mimeTypeInfo = {}
getSharedDriveACLsCount = 0 getSharedDriveACLsCount = 0
if buildTree: if buildTree:
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, user, i, count, query=DLP.fileIdEntity['query']) gettingEntity = _getGettingEntity(user, fileIdEntity)
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count, query=DLP.fileIdEntity['query'])
if not incrementalPrint: if not incrementalPrint:
fileTree, status = initFileTree(drive, fileIdEntity.get('shareddrive'), DLP, shareddriveFields, showParent, user, i, count) fileTree, status = initFileTree(drive, fileIdEntity.get('shareddrive'), DLP, shareddriveFields, showParent, user, i, count)
if not status: if not status:
@ -56483,7 +56482,7 @@ def printFileParentTree(users):
# [anyowner|(showownedby any|me|others)] # [anyowner|(showownedby any|me|others)]
# [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] # [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>]
# [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] # [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
# [filenamematchpattern <RegularExpression>] # [filenamematchpattern <REMatchPattern>]
# <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
# [excludetrashed] (addcsvdata <FieldName> <String>)* # [excludetrashed] (addcsvdata <FieldName> <String>)*
# [showsize] [showmimetypesize] [showlastmodification] # [showsize] [showmimetypesize] [showlastmodification]
@ -56497,7 +56496,7 @@ def printFileParentTree(users):
# [anyowner|(showownedby any|me|others)] # [anyowner|(showownedby any|me|others)]
# [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] # [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>]
# [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] # [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
# [filenamematchpattern <RegularExpression>] # [filenamematchpattern <REMatchPattern>]
# <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
# [excludetrashed] # [excludetrashed]
# [showsize] [showmimetypesize] [showlastmodification] # [showsize] [showmimetypesize] [showlastmodification]
@ -56656,7 +56655,8 @@ def printShowFileCounts(users):
userLastModification = { userLastModification = {
'lastModifiedFileId': '', 'lastModifiedFileName': '', 'lastModifiedFileId': '', 'lastModifiedFileName': '',
'lastModifyingUser': '', 'lastModifiedTime': NEVER_TIME} 'lastModifyingUser': '', 'lastModifiedTime': NEVER_TIME}
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, user, i, count, query=DLP.fileIdEntity['query']) gettingEntity = _getGettingEntity(user, fileIdEntity)
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count, query=DLP.fileIdEntity['query'])
try: try:
feed = yieldGAPIpages(drive.files(), 'list', 'files', feed = yieldGAPIpages(drive.files(), 'list', 'files',
pageMessage=getPageMessageForWhom(), pageMessage=getPageMessageForWhom(),
@ -57015,7 +57015,8 @@ def printShowFileShareCounts(users):
if not drive: if not drive:
continue continue
userShareCounts = FILESHARECOUNTS_ZEROCOUNTS.copy() userShareCounts = FILESHARECOUNTS_ZEROCOUNTS.copy()
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, user, i, count, query=query) gettingEntity = _getGettingEntity(user, fileIdEntity)
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count, query=query)
try: try:
feed = yieldGAPIpages(drive.files(), 'list', 'files', feed = yieldGAPIpages(drive.files(), 'list', 'files',
pageMessage=getPageMessageForWhom(), pageMessage=getPageMessageForWhom(),
@ -57078,7 +57079,7 @@ FILETREE_FIELDS_PRINT_ORDER = ['id', 'parents', 'owners', 'mimeType', 'size', 'e
# [anyowner|(showownedby any|me|others)] # [anyowner|(showownedby any|me|others)]
# [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] # [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>]
# [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] # [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
# [filenamematchpattern <RegularExpression>] # [filenamematchpattern <REMatchPattern>]
# <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
# [excludetrashed] # [excludetrashed]
# [fields <FileTreeFieldNameList>] # [fields <FileTreeFieldNameList>]
@ -57089,7 +57090,7 @@ FILETREE_FIELDS_PRINT_ORDER = ['id', 'parents', 'owners', 'mimeType', 'size', 'e
# [anyowner|(showownedby any|me|others)] # [anyowner|(showownedby any|me|others)]
# [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>] # [showmimetype [not] <MimeTypeList>] [showmimetype category <MimeTypeNameList>]
# [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>] # [sizefield quotabytesused|size] [minimumfilesize <Integer>] [maximumfilesize <Integer>]
# [filenamematchpattern <RegularExpression>] # [filenamematchpattern <REMatchPattern>]
# <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>] # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
# [excludetrashed] # [excludetrashed]
# [fields <FileTreeFieldNameList>] # [fields <FileTreeFieldNameList>]
@ -57279,7 +57280,8 @@ def printShowFileTree(users):
fileTree, status = initFileTree(drive, fileIdEntity.get('shareddrive'), DLP, shareddriveFields, True, user, i, count) fileTree, status = initFileTree(drive, fileIdEntity.get('shareddrive'), DLP, shareddriveFields, True, user, i, count)
if not status: if not status:
continue continue
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, user, i, count, query=DLP.fileIdEntity['query']) gettingEntity = _getGettingEntity(user, fileIdEntity)
printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count, query=DLP.fileIdEntity['query'])
try: try:
feed = yieldGAPIpages(drive.files(), 'list', 'files', feed = yieldGAPIpages(drive.files(), 'list', 'files',
pageMessage=getPageMessageForWhom(), pageMessage=getPageMessageForWhom(),
@ -57316,6 +57318,9 @@ def printShowFileTree(users):
fileEntryInfo = callGAPI(drive.files(), 'get', fileEntryInfo = callGAPI(drive.files(), 'get',
throwReasons=GAPI.DRIVE_GET_THROW_REASONS, throwReasons=GAPI.DRIVE_GET_THROW_REASONS,
fileId=fileId, fields=fields, supportsAllDrives=True) fileId=fileId, fields=fields, supportsAllDrives=True)
if (fileEntryInfo['mimeType'] == MIMETYPE_GA_FOLDER and fileEntryInfo.get('driveId') and
fileEntryInfo['name'] == TEAM_DRIVE and not fileEntryInfo.get('parents', [])):
fileEntryInfo['name'] = f"{SHARED_DRIVES}/{_getSharedDriveNameFromId(fileId)}"
if stripCRsFromName: if stripCRsFromName:
fileEntryInfo['name'] = _stripControlCharsFromName(fileEntryInfo['name']) fileEntryInfo['name'] = _stripControlCharsFromName(fileEntryInfo['name'])
if buildTree: if buildTree:
@ -57400,7 +57405,7 @@ createReturnItemMap = {
# gam <UserTypeEntity> create drivefile # gam <UserTypeEntity> create drivefile
# [(localfile <FileName>|-)|(url <URL>)] # [(localfile <FileName>|-)|(url <URL>)]
# [(drivefilename|newfilename <DriveFileName>) | (replacefilename <RegularExpression> <String>)*] # [(drivefilename|newfilename <DriveFileName>) | (replacefilename <REMatchPattern> <RESubstitution>)*]
# [stripnameprefix <String>] # [stripnameprefix <String>]
# [timestamp <Boolean>]] [timeformat <String>] # [timestamp <Boolean>]] [timeformat <String>]
# <DriveFileCreateAttribute>* [noduplicate] # <DriveFileCreateAttribute>* [noduplicate]
@ -57928,7 +57933,7 @@ def checkDriveFileShortcut(users):
# gam <UserTypeEntity> update drivefile <DriveFileEntity> [copy] [returnidonly|returnlinkonly] # gam <UserTypeEntity> update drivefile <DriveFileEntity> [copy] [returnidonly|returnlinkonly]
# [(localfile <FileName>|-)|(url <URL>)] # [(localfile <FileName>|-)|(url <URL>)]
# [retainname | (newfilename <DriveFileName>) | (replacefilename <RegularExpression> <String>)*] # [retainname | (newfilename <DriveFileName>) | (replacefilename <REMatchPattern> <RESubstitution>)*]
# [stripnameprefix <String>] # [stripnameprefix <String>]
# [timestamp <Boolean>]] [timeformat <String>] # [timestamp <Boolean>]] [timeformat <String>]
# <DriveFileUpdateAttribute>* # <DriveFileUpdateAttribute>*
@ -58393,7 +58398,7 @@ def getCopyMoveOptions(myarg, copyMoveOptions):
elif myarg =='stripnameprefix': elif myarg =='stripnameprefix':
copyMoveOptions['stripNamePrefix'] = getString(Cmd.OB_STRING, minLen=0) copyMoveOptions['stripNamePrefix'] = getString(Cmd.OB_STRING, minLen=0)
elif myarg == 'replacefilename': elif myarg == 'replacefilename':
copyMoveOptions['replaceFilename'].append(getREPatternReplacement(re.IGNORECASE)) copyMoveOptions['replaceFilename'].append(getREPatternSubstitution(re.IGNORECASE))
elif myarg == 'showpermissionmessages': elif myarg == 'showpermissionmessages':
copyMoveOptions['showPermissionMessages'] = getBoolean() copyMoveOptions['showPermissionMessages'] = getBoolean()
elif myarg == 'sendemailifrequired': elif myarg == 'sendemailifrequired':
@ -59033,7 +59038,7 @@ copyReturnItemMap = {
} }
# gam <UserTypeEntity> copy drivefile <DriveFileEntity> # gam <UserTypeEntity> copy drivefile <DriveFileEntity>
# [newfilename <DriveFileName>] (replacefilename <RegularExpression> <String>)* # [newfilename <DriveFileName>] (replacefilename <REMatchPattern> <RESubstitution>)*
# [stripnameprefix <String>] # [stripnameprefix <String>]
# [excludetrashed] # [excludetrashed]
# [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*)) | # [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*)) |
@ -59043,9 +59048,9 @@ copyReturnItemMap = {
# [mergewithparent [<Boolean>]] [recursive [depth <Number>]] # [mergewithparent [<Boolean>]] [recursive [depth <Number>]]
# <DriveFileCopyAttribute>* # <DriveFileCopyAttribute>*
# [skipids <DriveFileEntity>] # [skipids <DriveFileEntity>]
# [copysubfiles [<Boolean>]] [filenamematchpattern <RegularExpression>] [filemimetype [not] <MimeTypeList>] # [copysubfiles [<Boolean>]] [filenamematchpattern <REMatchPattern>] [filemimetype [not] <MimeTypeList>]
# [copysubfolders [<Boolean>]] [foldernamematchpattern <RegularExpression>] # [copysubfolders [<Boolean>]] [foldernamematchpattern <REMatchPattern>]
# [copysubshortcuts [<Boolean>]] [shortcutnamematchpattern <RegularExpression>] # [copysubshortcuts [<Boolean>]] [shortcutnamematchpattern <REMatchPattern>]
# [duplicatefiles overwriteolder|overwriteall|duplicatename|uniquename|skip] # [duplicatefiles overwriteolder|overwriteall|duplicatename|uniquename|skip]
# [duplicatefolders merge|duplicatename|uniquename|skip] # [duplicatefolders merge|duplicatename|uniquename|skip]
# [copiedshortcutspointtocopiedfiles [<Boolean>]] # [copiedshortcutspointtocopiedfiles [<Boolean>]]
@ -65073,13 +65078,13 @@ SHAREDDRIVE_ACL_ROLES_MAP = {
# gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*] # gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*]
# [asadmin [shareddriveadminquery|query <QuerySharedDrive>]] # [asadmin [shareddriveadminquery|query <QuerySharedDrive>]]
# [matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] # [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
# (role|roles <SharedDriveACLRoleList>)* # (role|roles <SharedDriveACLRoleList>)*
# [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]] # [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
# [guiroles [<Boolean>]] [formatjson [quotechar <Character>]] # [guiroles [<Boolean>]] [formatjson [quotechar <Character>]]
# gam <UserTypeEntity> show shareddrives # gam <UserTypeEntity> show shareddrives
# [asadmin [shareddriveadminquery|query <QuerySharedDrive>]] # [asadmin [shareddriveadminquery|query <QuerySharedDrive>]]
# [matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] # [matchname <REMatchPattrn>] [orgunit|org|ou <OrgUnitPath>]
# (role|roles <SharedDriveACLRoleLIst>)* # (role|roles <SharedDriveACLRoleLIst>)*
# [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]] # [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
# [guiroles [<Boolean>]] [formatjson] # [guiroles [<Boolean>]] [formatjson]
@ -65373,7 +65378,7 @@ SHOW_NO_PERMISSIONS_DRIVES_CHOICE_MAP = {
# gam [<UserTypeEntity>] print shareddriveacls [todrive <ToDriveAttribute>*] # gam [<UserTypeEntity>] print shareddriveacls [todrive <ToDriveAttribute>*]
# [asadmin] [shareddriveadminquery|query <QuerySharedDrive>] # [asadmin] [shareddriveadminquery|query <QuerySharedDrive>]
# [matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] # [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
# [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)* # [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
# <PermissionMatch>* [<PermissionMatchAction>] [pmselect] # <PermissionMatch>* [<PermissionMatchAction>] [pmselect]
# [oneitemperrow] [maxitems <Integer>] # [oneitemperrow] [maxitems <Integer>]
@ -65383,7 +65388,7 @@ SHOW_NO_PERMISSIONS_DRIVES_CHOICE_MAP = {
# [formatjson [quotechar <Character>]] # [formatjson [quotechar <Character>]]
# gam [<UserTypeEntity>] show shareddriveacls # gam [<UserTypeEntity>] show shareddriveacls
# [asadmin] [shareddriveadminquery|query <QuerySharedDrive>] # [asadmin] [shareddriveadminquery|query <QuerySharedDrive>]
# [matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>] # [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
# [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)* # [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
# <PermissionMatch>* [<PermissionMatchAction>] [pmselect] # <PermissionMatch>* [<PermissionMatchAction>] [pmselect]
# [oneitemperrow] [maxitems <Integer>] # [oneitemperrow] [maxitems <Integer>]
@ -66143,7 +66148,7 @@ def checkUserGroupMatchPattern(groupEmail, matchPattern):
# gam <UserTypeEntity> delete group|groups # gam <UserTypeEntity> delete group|groups
# [(domain <DomainName>)|(customerid <CustomerID>)| # [(domain <DomainName>)|(customerid <CustomerID>)|
# (emailmatchpattern [not] <RegularExpression>)|<GroupEntity>] # (emailmatchpattern [not] <REMatchPattern>)|<GroupEntity>]
def deleteUserFromGroups(users): def deleteUserFromGroups(users):
cd = buildGAPIObject(API.DIRECTORY) cd = buildGAPIObject(API.DIRECTORY)
groupKeys = None groupKeys = None
@ -68683,7 +68688,8 @@ def cleanLabelQuery(labelQuery):
labelQuery = labelQuery.replace(ch, '-') labelQuery = labelQuery.replace(ch, '-')
return labelQuery.lower() return labelQuery.lower()
# gam <UserTypeEntity> update label|labels [search <RegularExpression>] [replace <LabelReplacement>] [merge [keepoldlabel]] # gam <UserTypeEntity> update label|labels
# [search <REMatchPattern>] [replace <RESubstitution>] [merge [keepoldlabel]]
# search defaults to '^Inbox/(.*)$' which will find all labels in the Inbox # search defaults to '^Inbox/(.*)$' which will find all labels in the Inbox
# replace defaults to '%s' # replace defaults to '%s'
def updateLabels(users): def updateLabels(users):
@ -68698,7 +68704,7 @@ def updateLabels(users):
pattern = validateREPattern(search, re.IGNORECASE) pattern = validateREPattern(search, re.IGNORECASE)
elif myarg == 'replace': elif myarg == 'replace':
replaceLocation = Cmd.Location() replaceLocation = Cmd.Location()
replace = getString(Cmd.OB_LABEL_REPLACEMENT) replace = getString(Cmd.OB_RE_SUBSTITUTION)
elif myarg == 'merge': elif myarg == 'merge':
merge = True merge = True
elif myarg == 'keepoldlabel': elif myarg == 'keepoldlabel':
@ -68708,12 +68714,8 @@ def updateLabels(users):
# Validate that number of substitions in replace matches the number of groups in pattern # Validate that number of substitions in replace matches the number of groups in pattern
useRegexSub = replace.find('%s') == -1 useRegexSub = replace.find('%s') == -1
if useRegexSub: if useRegexSub:
patternGroups = pattern.groups Cmd.SetLocation(replaceLocation)
replSubs = REPLACE_GROUP_PATTERN.findall(replace) validateREPatternSubstitution(pattern, replace)
for replSub in replSubs:
if int(replSub) > patternGroups:
Cmd.SetLocation(replaceLocation)
usageErrorExit(Msg.MISMATCH_RE_SEARCH_REPLACE_SUBFIELDS.format(pattern.groups, search, int(replSub), replace))
else: else:
if pattern.groups != replace.count('%s'): if pattern.groups != replace.count('%s'):
Cmd.SetLocation(replaceLocation) Cmd.SetLocation(replaceLocation)
@ -68735,7 +68737,10 @@ def updateLabels(users):
match_result = pattern.match(label['name']) match_result = pattern.match(label['name'])
if match_result is not None: if match_result is not None:
labelMatches += 1 labelMatches += 1
newLabelName = pattern.sub(replace, label['name']) if useRegexSub else replace % match_result.groups() if useRegexSub:
newLabelName = pattern.sub(replace, label['name'])
else:
newLabelName = replace % match_result.groups()
newLabelNameLower = newLabelName.lower() newLabelNameLower = newLabelName.lower()
try: try:
Act.Set(Act.RENAME) Act.Set(Act.RENAME)
@ -68868,7 +68873,7 @@ def deleteLabels(users, labelEntity):
except (GAPI.serviceNotAvailable, GAPI.badRequest): except (GAPI.serviceNotAvailable, GAPI.badRequest):
userGmailServiceNotEnabledWarning(user, i, count) userGmailServiceNotEnabledWarning(user, i, count)
# gam <UserTypeEntity> delete label|labels <LabelName>|regex:<RegularExpression> # gam <UserTypeEntity> delete label|labels <LabelName>|regex:<REMatchPattern>
def deleteLabel(users): def deleteLabel(users):
deleteLabels(users, getStringReturnInList(Cmd.OB_LABEL_NAME)) deleteLabels(users, getStringReturnInList(Cmd.OB_LABEL_NAME))
@ -70162,7 +70167,7 @@ def _draftImportInsertMessage(users, operation):
# gam <UserTypeEntity> draft message # gam <UserTypeEntity> draft message
# <MessageContent> # <MessageContent>
# (replace <Tag> <UserReplacement>)* # (replace <Tag> <UserReplacement>)*
# (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*
# (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)* # (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
# (attach <FileName> [charset <CharSet>])* # (attach <FileName> [charset <CharSet>])*
# (embedimage <FileName> <String>)* # (embedimage <FileName> <String>)*
@ -70172,7 +70177,7 @@ def draftMessage(users):
# gam <UserTypeEntity> import message # gam <UserTypeEntity> import message
# <MessageContent> # <MessageContent>
# (replace <Tag> <UserReplacement>)* # (replace <Tag> <UserReplacement>)*
# (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*
# (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)* # (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
# (addlabel <LabelName>)* [labels <LabelNameList>] # (addlabel <LabelName>)* [labels <LabelNameList>]
# (attach <FileName> [charset <CharSet>])* # (attach <FileName> [charset <CharSet>])*
@ -70184,7 +70189,7 @@ def importMessage(users):
# gam <UserTypeEntity> insert message # gam <UserTypeEntity> insert message
# <MessageContent> # <MessageContent>
# (replace <Tag> <UserReplacement>)* # (replace <Tag> <UserReplacement>)*
# (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)* # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*
# (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)* # (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
# (addlabel <LabelName>)* [labels <LabelNameList>] # (addlabel <LabelName>)* [labels <LabelNameList>]
# (attach <FileName> [charset <CharSet>])* # (attach <FileName> [charset <CharSet>])*
@ -70994,21 +70999,21 @@ def printShowMessagesThreads(users, entityType):
# gam <UserTypeEntity> print message|messages [todrive <ToDriveAttribute>*] # gam <UserTypeEntity> print message|messages [todrive <ToDriveAttribute>*]
# (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>) # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>)
# [labelmatchpattern <RegularExpression>] [sendermatchpattern <RegularExpression>] # [labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
# [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]] # [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
# [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet] # [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
# [convertcrnl] [delimiter <Character>] # [convertcrnl] [delimiter <Character>]
# [countsonly|positivecountsonly] [useronly] # [countsonly|positivecountsonly] [useronly]
# [[attachmentnamepattern <RegularExpression>] # [[attachmentnamepattern <REMatchPattern>]
# [showattachments [noshowtextplain]]] # [showattachments [noshowtextplain]]]
# (addcsvdata <FieldName> <String>)* # (addcsvdata <FieldName> <String>)*
# gam <UserTypeEntity> show message|messages # gam <UserTypeEntity> show message|messages
# (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>) # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>)
# [labelmatchpattern <RegularExpression>] [sendermatchpattern <RegularExpression>] # [labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
# [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]] # [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
# [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet] # [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
# [countsonly|positivecountsonly] [useronly] # [countsonly|positivecountsonly] [useronly]
# [[attachmentnamepattern <RegularExpression>] # [[attachmentnamepattern <REMatchPattern>]
# [showattachments [noshowtextplain]] # [showattachments [noshowtextplain]]
# [saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]] # [saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]]
# [uploadattachments [<DriveFileParentAttribute>]]] # [uploadattachments [<DriveFileParentAttribute>]]]
@ -71017,21 +71022,21 @@ def printShowMessages(users):
# gam <UserTypeEntity> print thread|threads [todrive <ToDriveAttribute>*] # gam <UserTypeEntity> print thread|threads [todrive <ToDriveAttribute>*]
# (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <ThreadIDEntity>) # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <ThreadIDEntity>)
# [labelmatchpattern <RegularExpression>] # [labelmatchpattern <REMatchPattern>]
# [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]] # [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
# [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet] # [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
# [convertcrnl] [delimiter <Character>] # [convertcrnl] [delimiter <Character>]
# [countsonly|positivecountsonly] [useronly] # [countsonly|positivecountsonly] [useronly]
# [[attachmentnamepattern <RegularExpression>] # [[attachmentnamepattern <REMatchPattern>]
# [showattachments [noshowtextplain]]] # [showattachments [noshowtextplain]]]
# (addcsvdata <FieldName> <String>)* # (addcsvdata <FieldName> <String>)*
# gam <UserTypeEntity> show thread|threads # gam <UserTypeEntity> show thread|threads
# (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <ThreadIDEntity>) # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <ThreadIDEntity>)
# [labelmatchpattern <RegularExpression>] # [labelmatchpattern <REMatchPattern>]
# [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]] # [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
# [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet] # [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
# [countsonly|positivecountsonly] [useronly] # [countsonly|positivecountsonly] [useronly]
# [[attachmentnamepattern <RegularExpression>] # [[attachmentnamepattern <REMatchPattern>]
# [showattachments [noshowtextplain]] # [showattachments [noshowtextplain]]
# [saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]] # [saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]]
# [uploadattachments [<DriveFileParentAttribute>]]] # [uploadattachments [<DriveFileParentAttribute>]]]
@ -72493,7 +72498,7 @@ SMTPMSA_REQUIRED_FIELDS = ['host', 'port', 'username', 'password']
# gam <UserTypeEntity> [create] sendas <EmailAddress> [name] <String> # gam <UserTypeEntity> [create] sendas <EmailAddress> [name] <String>
# [<SendAsContent> # [<SendAsContent>
# (replace <Tag> <UserReplacement>)* # (replace <Tag> <UserReplacement>)*
# (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*] # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
# [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>] # [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
# [smtpmsa.host <SMTPHostName> smtpmsa.port 25|465|587 # [smtpmsa.host <SMTPHostName> smtpmsa.port 25|465|587
# smtpmsa.username <UserName> smtpmsa.password <Password> # smtpmsa.username <UserName> smtpmsa.password <Password>
@ -72501,7 +72506,7 @@ SMTPMSA_REQUIRED_FIELDS = ['host', 'port', 'username', 'password']
# gam <UserTypeEntity> update sendas <EmailAddress> [name <String>] # gam <UserTypeEntity> update sendas <EmailAddress> [name <String>]
# [<SendAsContent> # [<SendAsContent>
# (replace <Tag> <UserReplacement>)* # (replace <Tag> <UserReplacement>)*
# (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*] # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
# [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>] # [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
def createUpdateSendAs(users): def createUpdateSendAs(users):
updateCmd = Act.Get() == Act.UPDATE updateCmd = Act.Get() == Act.UPDATE
@ -73338,7 +73343,7 @@ def printShowCSEKeyPairs(users):
# gam <UserTypeEntity> signature|sig # gam <UserTypeEntity> signature|sig
# <SignatureContent> # <SignatureContent>
# (replace <Tag> <String>)* # (replace <Tag> <String>)*
# (replaceregex <RegularExpression> <String> <Tag> <String>)* # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <String>)*
# [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>] # [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
# [name <String>] # [name <String>]
# [primary] # [primary]
@ -73434,7 +73439,7 @@ def _showVacation(user, i, count, result, showDisabled, sigReplyFormat):
# gam <UserTypeEntity> vacation [<Boolean>] [subject <String>] # gam <UserTypeEntity> vacation [<Boolean>] [subject <String>]
# [<VacationMessageContent> # [<VacationMessageContent>
# (replace <Tag> <UserReplacement>)* # (replace <Tag> <UserReplacement>)*
# (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*] # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
# [html [<Boolean>]] [contactsonly [<Boolean>]] [domainonly [<Boolean>]] # [html [<Boolean>]] [contactsonly [<Boolean>]] [domainonly [<Boolean>]]
# [start|startdate <Date>|Started] [end|enddate <Date>|NotSpecified] # [start|startdate <Date>|Started] [end|enddate <Date>|NotSpecified]
def setVacation(users): def setVacation(users):

View File

@ -952,7 +952,6 @@ class GamCLArgs():
OB_LABEL_ID_LIST = 'LabelIDLIst' OB_LABEL_ID_LIST = 'LabelIDLIst'
OB_LABEL_NAME = 'LabelName' OB_LABEL_NAME = 'LabelName'
OB_LABEL_NAME_LIST = 'LabelNameList' OB_LABEL_NAME_LIST = 'LabelNameList'
OB_LABEL_REPLACEMENT = 'LabelReplacement'
OB_LANGUAGE_LIST = 'LanguageList' OB_LANGUAGE_LIST = 'LanguageList'
OB_LOOKERSTUDIO_PERMISSION_ENTITY = 'LookerStudioPermissionEntity' OB_LOOKERSTUDIO_PERMISSION_ENTITY = 'LookerStudioPermissionEntity'
OB_MATTER_ITEM = 'MatterItem' OB_MATTER_ITEM = 'MatterItem'
@ -991,7 +990,7 @@ class GamCLArgs():
OB_RESOURCE_ENTITY = 'ResourceEntity' OB_RESOURCE_ENTITY = 'ResourceEntity'
OB_RESOURCE_ID = 'ResourceID' OB_RESOURCE_ID = 'ResourceID'
OB_RE_PATTERN = 'REPattern' OB_RE_PATTERN = 'REPattern'
OB_RE_REPLACEMENT = 'REReplacement' OB_RE_SUBSTITUTION = 'RESubstitution'
OB_ROLE_ASSIGNMENT_ID = 'RoleAssignmentID' OB_ROLE_ASSIGNMENT_ID = 'RoleAssignmentID'
OB_ROLE_ITEM = 'RoleItem' OB_ROLE_ITEM = 'RoleItem'
OB_ROLE_LIST = 'RoleList' OB_ROLE_LIST = 'RoleList'