Public/Add-GDriveFolder.ps1

<#
.SYNOPSIS
    Creates new GoogleDrive Item, set metadata and upload content
.DESCRIPTION
    Creates new GoogleDrive Item, set metadata and upload content
.PARAMETER Path
    Path to folder to upload
.PARAMETER ParentID
    Folder ID in which new item will be placed
.PARAMETER Recurse
    Recursive upload
.PARAMETER ShowProgress
    Show progress bar while uploading
.PARAMETER AccessToken
    Access Token for request
.EXAMPLE
    Add-GDriveFolder -AccessToken $access_token -Path D:\SomeFolder
.OUTPUTS
    Json with uploaded folder metadata as PSObject
.NOTES
    Author: Max Kozlov
.LINK
    New-GDriveFolder
    Add-GDriveItem
#>

function Add-GDriveFolder {
[CmdletBinding(SupportsShouldProcess=$true)]
param(
    [Parameter(Mandatory)]
    $Path,
    [string[]]$ParentID = @('root'),

    [switch]$Recurse,

    [switch]$ShowProgress,

    [Parameter(Mandatory)]
    [string]$AccessToken
)
    $folder = Get-Item $path
    
    $CommonParams = @{
        ParentID = $ParentID
        AccessToken = $AccessToken
    }

    if ($ShowProgress) {
        Write-Progress -Activity ('Uploading ' + $Path) -Status ('Create Folder ' + $folder.Name)
    }
    $gdfolder = New-GDriveFolder -Name $folder.Name @CommonParams
    if ($gdfolder) {
        $CommonParams.ParentID = $gdfolder.Id
        foreach ($file in (Get-ChildItem $folder)) {
            if ($file -is [System.IO.DirectoryInfo]) {
                if ($Recurse) {
                    $null = Add-GDriveFolder -Path $file.FullName -Recurse @CommonParams -ShowProgress:$ShowProgress
                }
            }
            else {
                $null = Add-GDriveItem @CommonParams -Name $file.Name -InFile $file.FullName -ShowProgress:$ShowProgress
            }
        }
        $gdfolder
    }
    if ($ShowProgress) {
        Write-Progress -Activity ('Uploading ' + $Path) -Completed
    }
}