使用Windows Powershell批量删除工作表行

apfautz
apfautz ✭✭
编辑06/14/23 最佳实践

目前还没有一种方法可以使用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 ()