Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用google drive api复制google幻灯片文件_Python_Google Drive Api_Google Slides Api - Fatal编程技术网

Python 无法使用google drive api复制google幻灯片文件

Python 无法使用google drive api复制google幻灯片文件,python,google-drive-api,google-slides-api,Python,Google Drive Api,Google Slides Api,我想复制谷歌硬盘中现有的模板ppt。然后我想将占位符文本更改为其他文本 这就是我正在尝试的 from google.oauth2 import service_account import googleapiclient.discovery SCOPES = ( 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/presentations', ) SERVICE_ACCOUNT_

我想复制谷歌硬盘中现有的模板ppt。然后我想将占位符文本更改为其他文本

这就是我正在尝试的

from google.oauth2 import service_account
import googleapiclient.discovery


SCOPES = (
    'https://www.googleapis.com/auth/drive',
    'https://www.googleapis.com/auth/presentations',
)
SERVICE_ACCOUNT_FILE = 'cred.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES) 

SLIDES = discovery.build('slides', 'v1', credentials=credentials)
DRIVE  = discovery.build('drive',  'v3', credentials=credentials)

TMPLFILE = 'title slide template' 

rsp = DRIVE.files().list(q="name='%s'" % TMPLFILE).execute().get('files')[0]
print(rsp)
DATA = {'name': 'Google Slides API template DEMO'}
print('** Copying template %r as %r' % (rsp['name'], DATA['name']))
DECK_ID = DRIVE.files().copy(body=DATA, fileId=rsp['id']).execute().get('id')
print(DECK_ID)

print('** Replacing placeholder text')

reqs = [
    {'replaceAllText': {
        'containsText': {'text': '{{text}}'},
        'replaceText': final_til[0]
    }},
]

SLIDES.presentations().batchUpdate(body={'requests': reqs},
        presentationId=DECK_ID).execute()
print('DONE')
但它不起作用。我没有得到任何错误。一切正常,但我没有看到新的ppt

输出:

{'kind': 'drive#file', 'id': '15mVjkrT7PkckKetK_q9aYRVxaDcwDdHpAh7xjrAWB6Q', 'name': 'title slide template', 'mimeType': 'application/vnd.google-apps.presentation'}  <--- rsp
** Copying template 'title slide template' as 'Google Slides API template DEMO'
11O97tySSNaboW6YRVD62Q7HLs8aVuS2pWyLYXImdSec   <-- DECK_ID
** Replacing placeholder text
DONE

然后,它确实替换了文本,但在我的模板文件中,我不想要它


为什么会发生这种情况?

我相信你目前的情况和目标如下

  • 根据你的剧本,
    • 您正在为python使用googleapis
    • 您已经能够使用服务帐户使用驱动器API和幻灯片API
    • 现有模板ppt演示文稿
      是不是PowerPoint文件的Google幻灯片
修改点:
  • 从脚本和
    中删除,但它不起作用。我没有得到任何错误。一切正常,但我没有看到新的ppt。
    ,我知道您可能希望看到谷歌硬盘上服务帐户复制的谷歌幻灯片

    • 当服务帐户复制谷歌幻灯片时,复制的谷歌幻灯片将放入服务帐户的驱动器。服务驱动器帐户与您的Google驱动器不同。这样,您就无法在驱动器上看到复制的谷歌幻灯片。我想这可能是你问题的原因
  • 例如,为了查看Google Drive上服务帐户复制的Google幻灯片,可以使用以下变通方法

  • 将复制的谷歌幻灯片与您的谷歌帐户电子邮件共享。
    • 在这种情况下,您可以在共享文件夹中看到共享文件
  • 首先,它会在你的谷歌驱动器中创建一个新文件夹,并与服务帐户的电子邮件共享该文件夹。复制谷歌幻灯片时,它会将共享文件夹设置为目标文件夹
解决方法1: 在此解决方案中,它将复制的谷歌幻灯片与您的谷歌帐户电子邮件共享。当这反映到脚本中时,它将变成如下所示

修改脚本: 在这种情况下,将使用“权限:创建”为复制的文件创建新权限

发件人: 致: 致:
  • 请将共享文件夹的文件夹ID设置为
    ###
参考资料:

我相信您目前的情况和目标如下

  • 根据你的剧本,
    • 您正在为python使用googleapis
    • 您已经能够使用服务帐户使用驱动器API和幻灯片API
    • 现有模板ppt演示文稿
      是不是PowerPoint文件的Google幻灯片
修改点:
  • 从脚本和
    中删除,但它不起作用。我没有得到任何错误。一切正常,但我没有看到新的ppt。
    ,我知道您可能希望看到谷歌硬盘上服务帐户复制的谷歌幻灯片

    • 当服务帐户复制谷歌幻灯片时,复制的谷歌幻灯片将放入服务帐户的驱动器。服务驱动器帐户与您的Google驱动器不同。这样,您就无法在驱动器上看到复制的谷歌幻灯片。我想这可能是你问题的原因
  • 例如,为了查看Google Drive上服务帐户复制的Google幻灯片,可以使用以下变通方法

  • 将复制的谷歌幻灯片与您的谷歌帐户电子邮件共享。
    • 在这种情况下,您可以在共享文件夹中看到共享文件
  • 首先,它会在你的谷歌驱动器中创建一个新文件夹,并与服务帐户的电子邮件共享该文件夹。复制谷歌幻灯片时,它会将共享文件夹设置为目标文件夹
解决方法1: 在此解决方案中,它将复制的谷歌幻灯片与您的谷歌帐户电子邮件共享。当这反映到脚本中时,它将变成如下所示

修改脚本: 在这种情况下,将使用“权限:创建”为复制的文件创建新权限

发件人: 致: 致:
  • 请将共享文件夹的文件夹ID设置为
    ###
参考资料:

    • @Tanaike的答案很好,但还有一个选择:

      帐户模拟
      credentials=service\u account.credentials.from\u service\u account\u文件(
      服务\帐户\文件,作用域=作用域)
      委派的\u凭证=凭证。带有\u主题()
      驱动器=生成('DRIVE','v3',凭据=委托的\u凭据)
      
      下面是一个很好的概述:,具体介绍了代码

      记住在GCP控制台和管理控制台中设置域范围的委派

      在GCP云控制台中初始化的项目也已从管理控制台>安全>API控件>域范围委派>添加新项目中被授予作用域

      脚本要做的第一件事是使用来自\u服务\u帐户\u文件的
      构建凭据:

      credentials=service\u account.credentials.from\u service\u account\u文件(
      服务\帐户\文件,作用域=作用域)
      
      然后它构建委托的凭证,即要模拟的用户:

      delegated_credentials=凭证。带有主题(“”)
      
      从那里,它可以正常地构建服务。您可以将其保存到用户的驱动器,就像用户自己在做一样

      工具书类

        • @Tanaike的答案很好,但还有一个选择:

          帐户模拟
          credentials=service\u account.credentials.from\u service\u account\u文件(
          服务\帐户\文件,作用域=作用域)
          委派的\u凭证=凭证。带有\u主题()
          驱动器=生成('DRIVE','v3',凭据=委托的\u凭据)
          
          下面是一个很好的概述:,具体说明
          SLIDES.presentations().batchUpdate(body={'requests': reqs},
                      presentationId=DECK_ID).execute()
          
          SLIDES.presentations().batchUpdate(body={'requests': reqs},
                      presentationId=rsp.get('id')).execute()
          
          print(DECK_ID)
          
          print('** Replacing placeholder text')
          
          print(DECK_ID)
          
          permission = {
              'type': 'user',
              'role': 'writer',
              'emailAddress': '###@gmail.com'  # <--- Please set the email of your Google account.
          }
          DRIVE.permissions().create(fileId=DECK_ID, body=permission).execute()
          
          print('** Replacing placeholder text')
          
          DATA = {'name': 'Google Slides API template DEMO'}
          
          DATA = {'name': 'Google Slides API template DEMO', 'parents': ['###']}