我正在處理包含三個選項卡的表格檔案。該檔案的目的是創建合同,添加與這些合同相關的資料,并在時機成熟時將其存檔。
第一個選項卡(稱為“作業表”)允許我記錄合同和一些資料,這要歸功于 Apps 腳本中制作的表格(它充當資料庫)。

第二個選項卡(稱為“Sheet2”)允許我在第一列中檢索不同的合同(在下拉選單中),并附加表單中不存在的其他值。它還包含一個復選框,用于在時機成熟時存檔這些合同。

最后一個選項卡(稱為“存檔”)允許我存盤存檔的合同。

這就是我想要的:當一個或多個合同要存檔時(選中復選框),腳本將資料保存在“存檔”選項卡中,清除第二個選項卡中的行并從中洗掉相應的合同資料庫。
最后一步有問題,我不知道該怎么做。該腳本不會洗掉正確的行,一段時間后我收到以下錯誤訊息:“那些行超出范圍。”。正如您從 Sheet2 的螢屏截圖中看到的那樣,我希望能夠按我想要的任何順序洗掉合同,這就是困擾我的地方。如果它與作業表的順序相同,我就不會有問題。
這是我的代碼:
function archiving(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet");
const sheet2 = ss.getSheetByName("Sheet2");
const archiving = ss.getSheetByName("Archiving");
var d = 0, rowToDelete = 0;
// Get nonempty's values of Sheet2
var tValuesSheet2 = sheet2.getRange("C2:H").getValues().filter(d =>d[0] !== '');
// Get nonempty's values of Sheet
var tValuesSheet = sheet.getRange("A2:E").getValues().filter(d =>d[0] !== '');
// For each value of Sheet2
for (let i = 0; i < tValuesSheet2.length; i ){
// If archiving's checkbox is checked
if(tValuesSheet2[i][5]){
// Archiving of values in "Archiving" Sheet
archiving.appendRow(tValuesSheet2[i]);
// Clear values of Sheet2
sheet2.getRange("C" (i 2) ":G" (i 2)).clear({contentsOnly: true, skipFilteredRows: true});
sheet2.getRange("H" (i 2)).setValue('FALSE');
// ----- PROBLEM HERE : Delete values of Sheet ---- //
// Get row of Sheet to delete
for (let j = 0; j < tValuesSheet.length; j ){
// If Data is same in Sheet and Sheet 2
if (tValuesSheet[j][0] == tValuesSheet2[i][0]){
rowToDelete = j 2;
}
}
sheet.deleteRow(rowToDelete - d);
d ;
}
}
}
你能幫我解決我的問題嗎?如果需要,這里是表格的鏈接。預先感謝您的幫助,對不起我的英語,我對此感到不舒服。
uj5u.com熱心網友回復:
修改點:
- 在您當前的腳本中,
sheet.deleteRow(rowToDelete - d)從第一行開始運行。我認為這可能是您遇到問題的原因。 - 在您的腳本中,
appendRow、clear、setValue和deleteRow在回圈中使用。在這種情況下,工藝成本會變高。參考
在此修改中,您的腳本通過降低流程成本進行了修改。修改后的腳本如下。
修改腳本:
function archiving() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet");
const sheet2 = ss.getSheetByName("Sheet2");
const archiving = ss.getSheetByName("Archiving");
// Retrieve values from "Sheet" and "Sheet2".
const lastRow = sheet.getLastRow();
const valuesSheet = sheet.getRange("A2:A" lastRow).getValues().map(([a]) => a);
const valuesSheet2 = sheet2.getRange("C2:H" sheet2.getLastRow()).getValues();
// Create objects for putting to "Archiving", clearing rows of "Sheet2", unchecking cells of "Sheet2", and deleting rows of "Sheet".
const { values, clearRows, uncheck, deleteRows } = valuesSheet2.reduce((o, r, i) => {
const check = r.pop();
if (check === true) {
o.values.push(r);
o.clearRows.push(`C${i 2}:G${i 2}`);
o.uncheck.push(`H${i 2}`);
const idx = valuesSheet.indexOf(r[0]);
if (idx > -1) {
o.deleteRows.push(idx 1);
}
}
return o;
}, { values: [], clearRows: [], uncheck: [], deleteRows: [] });
// Put values to "Archiving".
archiving.getRange(archiving.getLastRow() 1, 1, values.length, values[0].length).setValues(values);
// Clear rows of "Sheet2" and uncheck the checkboxes.
sheet2.getRangeList(clearRows).clear({ contentsOnly: true, skipFilteredRows: true });
sheet2.getRangeList(uncheck).uncheck();
// Delete rows of "Sheet".
const range = sheet.getRange("A2:E" lastRow);
const updatedValuesSheet = range.getValues().filter((_, i) => !deleteRows.includes(i 1));
range.clearContent().setBackground(null); // or clear()
sheet.getRange(2, 1, updatedValuesSheet.length, updatedValuesSheet[0].length).setValues(updatedValuesSheet);
}
筆記:
- 此示例腳本適用于您提供的電子表格。當您更改電子表格時,可能無法使用此腳本。請注意這一點。
參考:
- 減少()
- 類范圍串列
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536455.html
標籤:谷歌应用脚本谷歌表格
