我有一個檔案需要復制大約 125 次:每個用戶一個副本。作業表中有大約 1,000 行。我選擇只復制這個檔案,以便受保護的范圍、格式、過濾器等遵循它,而不必重新創建它們。
到目前為止我擁有的 Apps 腳本:
- 獲取指定列中的一組唯一電子郵件(大約 125 個唯一電子郵件)。
- 遍歷該陣列,并在執行此操作的同時制作“主”檔案(具有 1,000 行的檔案)的副本。
- 向重復檔案中的列添加過濾器并排除當前唯一的電子郵件地址。
- 然后遍歷每一行并檢查
!documentObject.isRowHiddenByFilter(row)并洗掉該行 iftrue。 - 最后,洗掉過濾器,該過濾器僅向目標用戶顯示與其相關的記錄。
為了洗掉可見行,我正在執行以下操作:
deleteVisibleRows(documentObject, lastRow) {
for (let r = lastRow; r > 1; r--) {
if(!documentObject.isRowHiddenByFilter(r)) {
documentObject.deleteRow(r);
}
}
}
這真的很慢:125 iterations * 1000 rows = 125,000 rows.
我更喜歡能夠公正selectRange和deleteVisibleRows不迭代加快這。
據我所知,沒有一種方法可以只洗掉可見行。它很可能是可見的,不可見的行也不會連續。
有什么建議?
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您想降低腳本的流程成本。
在這種情況下,我認為當使用 Sheets API 時,可以降低流程成本。所以在這個答案中,我想建議使用 Sheets API。
從您的腳本中,我了解到您的documentObject和值lastRow分別是類表和整數的物件。在此答案中,這些值用于對 Sheets API 的請求。當你的腳本deleteVisibleRows被修改時,它變成如下。
修改后的腳本:
在使用此腳本之前,請在高級 Google 服務中啟用 Sheets API。
function deleteVisibleRows(documentObject, lastRow) {
const spreadsheetId = documentObject.getParent().getId();
const sheetName = documentObject.getSheetName();
const sheetId = documentObject.getSheetId();
const rowMetadata = Sheets.Spreadsheets.get(spreadsheetId, { ranges: [sheetName], fields: "sheets(data(rowMetadata(hiddenByFilter)))" }).sheets[0].data[0].rowMetadata;
const requests = rowMetadata.reduceRight((ar, { hiddenByFilter }, i) => {
if (!hiddenByFilter && i > 0 && i 1 < lastRow) ar.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i 1, dimension: "ROWS" } } });
return ar;
}, []);
Sheets.Spreadsheets.batchUpdate({requests}, spreadsheetId);
}
筆記:
- 運行此函式時,顯示的行將被洗掉。請注意這一點。因此,當您測驗此腳本時,我建議您使用示例電子表格。
參考:
- 方法:電子表格.get
- 方法:電子表格.batchUpdate
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/372943.html
