2017-10-12 70 views
0

我有以下腳本需要在相關日子結束時運行,我試圖讓它在計時器上運行,我無法解決它。我有5張用於安排工作人員的一天的不同部分。在一天結束的時候,我需要將它發送到一張可以工作幾個小時並執行各種任務的主表。我的問題是: - 1)我有一張空白的Google工作表,裏面有5張紙+ 1張隱藏紙。這需要在其名稱的當天發送給主副本,如果可能的話自動發送。 2)他們可以提前3個月製作,不希望每天發送空白備份。 3)當我按任何新創建的工作表上的「備份」按鈕,我必須授權腳本。腳本不一致運行

有什麼辦法可以不必在新電子表格上授權腳本。有沒有人有更好的想法實現自動化?

function onOpen() { // This function adds a custom menu to the spreadsheet (Backup to archive) so you can run the script from there. 


var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Backup') 
    .addItem('Backup','dataBackup') 
    .addItem('Name','nameOfSpreadsheet') 
    .addToUi(); 

} 
function nameOfSpreadsheet() { 
var s=SpreadsheetApp.getActive().getName().replace(/(\d{1,2}\.\d{1,2}\.\d{1,2}).*/,'$1'); 
return s; 
} 

    function dataBackup() { 
    var inputSS = SpreadsheetApp.getActiveSpreadsheet(); 
    var archiveSS = SpreadsheetApp.openById('146WU8RghfFqlCpCSX7n6kBAKOyxcpVKt14yhVfvYz-g'); 
    var user = Session.getActiveUser().getEmail(); 
    var sheetNames = ['AM trip', 'PM trip', 'Pool/Beach', 'Night Dive']; 
    for (var i = 0; i < sheetNames.length; i++) { 

    var inputSheet = inputSS.getSheetByName(sheetNames[i]); 
    var archiveSheet = archiveSS.getSheetByName(sheetNames[i]); 

    var date = inputSheet.getRange('A2').getValue(); // Changed to stop inadvertent cell changes, also made text white so not seen. 
    var data = inputSheet.getRange('E7:U37').getValues().filter(function(row) { return row[0] !== '' || row[1] !== ''}); 

    for (var x = 0; x < data.length; x++) { 
     data[x].splice(0, 0, date); 
    } 
    var getDate = archiveSheet.getRange(archiveSheet.getLastRow(), 1).getValue(); 
    var maxRowLength = data.reduce(function(length, row) { return Math.max(length, row.length); }, 0); 
    var date = new Date(date); 

    if (date.getDate() === "Loading Data...") { 
    Utilities.sleep(10000); 
    SpreadsheetApp.flush(); 

    if (getDate.getDate() != date.getDate() || getDate.getMonth() != date.getMonth()) {  

     if (data.length != 0) { 
      archiveSheet.insertRowsAfter(archiveSheet.getLastRow(), data.length); 
      archiveSheet.getRange(archiveSheet.getLastRow() + 1, 1, data.length, maxRowLength).setValues(data); 
     } else { 
      archiveSheet.insertRowsAfter(archiveSheet.getLastRow(), 1); 
      archiveSheet.getRange(archiveSheet.getLastRow() + 1, 1, 1, 2).setValues([[date, 'No Data']]); 
     }}}}} 

回答

0

它沒有意義的,我把nameofSpreadsheet菜單.addItem('Name','nameOfSpreadsheet')。它沒有完成任何事情,因爲沒有辦法看到回報。

我在刺探重寫你的備份功能。我希望它有幫助。

function dataBackup() 
{ 
    var inputSS = SpreadsheetApp.getActiveSpreadsheet(); 
    var archiveSS = SpreadsheetApp.openById('146WU8RghfFqlCpCSX7n6kBAKOyxcpVKt14yhVfvYz-g'); 
    var sheetNames = ['AM trip', 'PM trip', 'Pool/Beach', 'Night Dive']; 
    for (var i=0; i<sheetNames.length; i++) 
    { 
    var inputSheet = inputSS.getSheetByName(sheetNames[i]); 
    var archiveSheet = archiveSS.getSheetByName(sheetNames[i]); 
    var date=new Date(inputSheet.getRange('A2').getValue());  
    var rng=inputSheet.getRange('E7:U37'); 
    var dataA=rng.getValues(); 
    var data=[]; 
    for(var j=0;i<dataA.length;j++) 
    { 
     if(dataA[j][0] && dataA[j][1]) 
     { 
     data.push([dataA[j].splice(0,0,date)]); 
     } 
    } 
    var dv=archiveSheet.getRange(archiveSheet.getLastRow(), 1).getValue(); 
    date=(typeof(dv)!='undefined')?dv:'No Date Found'; 
    if (data.length>0) 
    { 
     archiveSheet.insertRowsAfter(archiveSheet.getLastRow(), data.length); 
     archiveSheet.getRange(archiveSheet.getLastRow() + 1, 1, data.length, rng.getWidth()+1).setValues(data); 
    } 
    else 
    { 
     archiveSheet.insertRowsAfter(archiveSheet.getLastRow(), 1); 
     archiveSheet.getRange(archiveSheet.getLastRow() + 1, 1, 1, 2).setValues([[date, 'No Data']]); 
    } 
    } 
} 
+0

Thanks @cooper,我刪除了菜單中的電子表格名稱。是我認爲會起作用的其他東西,但沒有。感謝您的重寫將複製並檢查它,然後再回到你身邊。得到這個錯誤。有任何想法嗎? TypeError:無法從undefined讀取屬性「0」。 (行31,文件「更新備份數據」)這是行31「if(dataA [j] [0] && dataA [j] [1]) 」 – Paul