使用Windows Powershell批量删除工作表行
目前还没有一种方法可以使用Smartsheet API(我可以找到)批量删除行,所以我想我会分享我的想法。对于包含数千行的表,删除单行或小块行很慢。我能够使用这里找到的例子作为灵感……https://community.smartsheet.com/discussion/88154/how-to-delete-all-the-rows-of-a-sheet-using-python-at-once
基本思想是执行PUT rest调用,将每行的parentID属性设置为父行的行id。我用一个有20000个单列行的表格测试了这一点。如果需要,可以通过设置块大小将其分成更小的块。然后删除父行,父行也在一个DELETE rest调用中删除它们的子行。
您需要填充API Key和目标表的ID,以使脚本工作。
希望有人觉得这有帮助。
Powershell脚本:
函数DeleteSheetRows(美元(对象)表){
$sheetID = $sheet.id
$rowsurl = "$APIurl/sheets/$sheetID/rows"
$rows = $sheet.rows
#保释,如果在工作表中没有行
如果($行。长度-eq 0){返回}
单个或小块删除行非常慢。
#我们首先将大块的行作为子块移动到块的第一行下面。
#我们将存储父行的id,直到所有行都嵌套。
然后我们将删除父行,同时删除子行。
$r1 = 0
$chunksize = 20000 #这是测试的最大行数。据我所知,智能表ARRAY[]的大小没有限制。
$r2 = $r1 + $chunksize - 1
$name = $sheet.name
$parentIDs = [System.Collections.ArrayList]::new()
while ($r1 -lt $rows.Count) {
#检索行子集作为一个块。
$IDs = $rows[$r1..$r2].id
$rcount = $ id。数
#设置儿童和父行json数据。
$parentID = $ id [0]
$childIds = $IDs[1..$IDs. count]
$json = $childIDS | % {
[PSCustomObject] @ {
Id = $_;
parentId = $ parentId
}
} | ConvertTo-Json -Depth
#将子行移动到parentRow中。
$result = Invoke-RestMethod -uri $rowsurl -Method Put -Headers $put_headers -Body $json
如果美元的结果。message -eq "SUCCESS") {
$rcount = $ id。数
Write-host $rcount“嵌套到父节点的行”
} else {
Write-host $rcount " - " $result.message
}
#增加数据块
$r1 += $chunksize
$r2 += $chunksize
#存储父id。我们将在后面的步骤中删除所有的父母(和他们的孩子)。
(parentIDs.Add美元parentID.Tostring ())
}
#删除父行
$url = "$url/sheets/$sheetID/rows? "id = "
$rowstoDeleteUrl = $ url + [string]::join(',', $parentIDs.ToArray())
$rowstoDeleteUrl += "& ignoerowsnotfound =true"
$result = Invoke-RestMethod -Method Delete -Uri $rowstoDeleteUrl -Headers $get_headers
如果美元的结果。message -eq "SUCCESS") {
$rcount = $rows。数
Write-host $rcount "从$name中删除的行"
}
# cleanup(如果不这样做,可能会在大型脚本中导致大量内存泄漏)
$sheet = $null
$rows = $null
$json = $null
$ id = $null
$ parentid = $null
$ childds = $null
}
$timer = [Diagnostics.Stopwatch]::StartNew()
#设置智能表的访问变量
$apiKey = ""
$APIurl = "https://api.smartsheet.com/2.0”
$get_headers = @{"Authorization" = "Bearer " + $apiKey}
$put_headers = @{}
put_headers美元。添加(“授权”,“承载者”+ $apiKey)
put_headers美元。Add(“内容类型”、“application / json”)
$sheetID = "
if ($apiKey -eq " -or $ sheeid -eq ") {
抛出"确保在运行脚本之前填充apiKey和sheetID变量"
}
$url = "$url/sheets/$sheetID"
$sheet = Invoke-RestMethod -uri $surl -Headers $get_headers
美元DeleteSheetRows表
timer.elapsed.totalseconds美元
$ timer.Stop ()