2014-06-15 44 views
4

我可以用Google Apps腳本覆蓋圖片文件嗎?我試過了:用Google Apps腳本覆蓋圖片文件

file.setContent(newBlobImage); 
file.replace(newBlobImage); 

這些工作都沒有。 .setContent()會刪除文件中的任何數據,看起來也許它只是將變量名寫入文本或類似的東西。我假設.setContent().replace()都是針對文本文檔的,也許這就是他們不工作的原因。

如果是文本文件或電子表格,我可能會清除它,然後附加新的內容。

我可以垃圾文件,然後創建一個新的,但我寧願不,如果有其他方式。

如果我寫了一個同名的文件,它不會覆蓋現有文件,它會創建一個具有相同名稱的另一個文件。

我已經能夠垃圾文件的唯一方法是DocsList,我創建圖像文件的唯一成功是DriveApp。所以我必須用DocsList垃圾文件,然後用DriveApp創建另一個文件。

嗯,我已經想出瞭如何刪除文件而不將它發送到垃圾箱,所以我不需要以後清理垃圾箱。 Apps Script中的Google Drive SDK有一個remove方法,它不會將文件發送到垃圾箱,它只是消失了。

var myFolder = DriveApp.getFolderById('3Bg2dKau456ySkhNBWB98W5sSTM'); 

thisFile = myFolder.getFilesByName(myFileName); 

while (thisFile.hasNext()) { 
    var eachFile = thisFile.next(); 
    var idToDLET = eachFile.getId(); 
    Logger.log('idToDLET: ' + idToDLET); 

    var rtrnFromDLET = Drive.Files.remove(idToDLET); 
}; 

所以,我結合DriveApp服務和DriveAPI刪除的文件,而不將其發送到回收站。 DriveAPI .remove需要文件ID,但我沒有文件ID,因此文件被按名稱查找,然後檢索文件ID,然後使用ID刪除文件。所以,如果我找不到覆蓋該文件的方法,我至少可以刪除舊文件而不去垃圾。

我剛剛注意到DriveAPI服務有PatchUpdate選項。

.patch(resource, fileId, optionalArgs) 

Google Documentation Patch更新文件元數據。

resource arg可能是元數據。 fileId是不言自明的。我猜測optionalArgs是遵循HTTP請求補丁語義的參數嗎?我不知道。

它看起來像修補程序和更新將更新數據。更新是將

,如果你不提供可選參數清除之前設置的數據PUT請求。

根據文檔。所以使用補丁請求會更安全,因爲任何缺少的參數都會被忽略。我還沒有嘗試過,但也許這是答案。

我得到一個錯誤與Patch,所以我會盡力Update

.update(resource, fileId, mediaData) 

,已以BLOB的形式mediaData一個ARG。我認爲這是我需要的。但我不確定resource參數需要什麼。所以我卡在那裏。

回答

6

我想通了,我可以用Google Apps腳本和DriveAPI覆蓋圖片文件。我使用的是:

.update(File resource, String fileId, Blob mediaData) 

其中file resource是:

var myFileName = 'fileName' + '.jpg'; 

var file = { 
    title: myFileName, 
    mimeType: 'image/jpeg' 
}; 

我越來越與DriveApp服務的文件ID和斑點就是由用戶上傳。

要使用DriveAPI,您需要通過Resources,Advanced Google Services菜單添加它。將Drive API設置爲ON

var file = { 
    title: myFileName, 
    mimeType: 'image/jpeg' 
}; 

var myFolder = DriveApp.getFolderById('Folder ID'); 

var allFilesByName = myFolder.getFilesByName(myFileName); 

while (allFilesByName.hasNext()) { 
    var thisFile = allFilesByName.next(); 
    var theFileID = thisFile.getId(); 
    Logger.log('theFileID: ' + theFileID); 

    var myVar = Drive.Files.update(file, theFileID, uploadedBlob); 
}; 
+0

我可以在哪裏找到Google開發人員文檔中Drive.Files.update的API參數說明?找不到它。因爲我倒過了前兩個參數,並且您幫助我解決了我自己的問題。 –

+0

Drive API參考位於以下鏈接:[Google文檔](https://developers.google.com/drive/v2/ reference /)參考中的REST API和Apps腳本的語法不同。但是Apps腳本在自動完成中提供了語法。 –

+0

謝謝!我沒有考慮自動完成。當然 ! –

2

謝謝你的追蹤!

這讓我找到了解決我的問題的辦法:複製後移動綁定表並移動他的電子表格

必須在「資源腳本編輯器」中激活Drive應用高級服務才能運行此腳本。

function spreadsheetCopy() { 
    // Below is the file to be copied with a bound form. 
    var fileToCopy = DriveApp.getFileById("file_key"); // key is fileId 
    var saveFolder = DriveApp.getFolderById("folder_key"); // key is folderId 
    var currentFolder = ""; 
    (fileToCopy.getParents().next()) ? currentFolder = fileToCopy.getParents().next() : currentFolder = DriveApp.getRootFolder(); 
    Logger.log(currentFolder) 
    var copyFile = fileToCopy.makeCopy(saveFolder), 
     copyName = copyFile.getName(); 
    Utilities.sleep(30000); 
moveFormCopy(currentFolder, saveFolder, copyName); 
} 

function moveFormCopy(currentFolder, saveFolder, copyName) { 
    var formsInFolder = currentFolder.getFilesByType(MimeType.GOOGLE_FORMS); 
    var form, copyForm, copyFormMimeType, copyFormName, copyFormId; 
    while (formsInFolder.hasNext()) { 
    form = formsInFolder.next(); 
    if (copyName === form.getName()) { 
     copyForm = form; 
     copyFormMimeType = copyForm.getMimeType(); 
     copyFormName = copyForm.getName(); 
     copyFormId = copyForm.getId(); 
     break; 
    } 
    }; 
    var resource = {title: copyName, mimeType: copyFormMimeType}; 
    Drive.Files.patch(resource, copyFormId, {addParents: saveFolder.getId(), removeParents: currentFolder.getId()}) 
}