function onEdit() {
var openRequests = SpreadsheetApp.getActive().getSheetByName('Open Requests');
var lastRowOpen = openRequests.getLastRow();
var closedRequests = SpreadsheetApp.getActive().getSheetByName('Closed Requests');
var lastRowClose = closedRequests.getLastRow();
var closed = openRequests.getRange(2,8,lastRowOpen,1).getValues();
for (var i = 0; i < lastRowOpen; i++)
{
if (closed[i][0].toString() == 'Yes')
{
var line = i+2;
if (closedRequests.getLastRow() == 1)
{
openRequests.getRange(line,1,1,9).copyTo(closedRequests.getRange(2,1,1,9));
closedRequests.getRange(2,9,1,1).setValue(new Date());
openRequests.deleteRow(line);
}
else
{
openRequests.getRange(line,1,1,9).copyTo(closedRequests.getRange(lastRowClose+1,1,1,9));
closedRequests.getRange(lastRowClose+1,9,1,1).setValue(new Date());
openRequests.deleteRow(line);
}
}
}
谷歌Apps腳本雙刪除行我已經設置了一個觸發運行onEdit。它所做的是檢查名爲Closed
的列以查看它是否表示Yes
。 Closed
列有一個數據驗證下拉菜單,其中包含值Yes
。
所以,當我點擊下拉菜單,選擇Yes
,應該整行復制到名爲Closed Requests
然後刪除叫Open Requests
電子表格中的行另一片。
我遇到的問題是,大約有50%的時間,它刪除了我選擇的行Yes
,但它也刪除了它下面的行(大約50%的時間發生這種情況,只有一些時間第二個刪除的行顯示在Closed Requests
中,除非我撤消,否則整行的其他時間會永遠消失)。
從我所知道的情況來看,deleteRow()
函數刪除整行並將其下的所有行向上移一行以填充空白。所以下面那行意味着被刪除的行會被移動到同一行並被刪除。我不知道爲什麼函數被調用兩次。
我試着添加一些延遲,但它似乎並沒有工作。
這似乎工作到目前爲止。你能告訴我我在做什麼導致了雙重刪除? – Jack
嗨,傑克,我不知道你的劇本爲什麼會出現。在循環中修改文檔時,我曾經見過類似的東西。我提出的解決方案直接通過源代碼進行,無需循環前面的回覆,因爲從下拉列表中選擇「是」表示不應該有必要。希望這能滿足你的需求。問候,Michael – ScampMichael
P.S.如果您希望追究此問題,可以通過Google Apps腳本問題跟蹤器在https://code.google.com/p/google-apps-script-issues/issues/list中提交併發佈更具體的答案 – ScampMichael